Ruby中super关键字与继承的代码执行逻辑问询
代码执行逻辑与Ruby中
super的调用机制解析 咱们一步步拆解这段Ruby代码的执行逻辑,还有类B里super的核心机制——先从你测试的类A说起,再深入类B的继承逻辑~
一、类A的执行逻辑(你的测试用例)
你创建的inst_A = A.new是类A的实例,调用方法的流程很直观:
- 调用
inst_A.method_1("foo"):直接触发类A定义的method_1方法,把参数"foo"传入,方法内部通过puts输出对应字符串,结果就是Using method_1 with argument value 'foo'。 - 调用
inst_A.method_2("bar"):触发类A的method_2,这个方法内部直接调用了同实例的method_1,并把收到的参数"bar"传递过去,最终还是执行method_1输出Using method_1 with argument value 'bar'。
这部分就是普通的类方法调用,没有继承逻辑参与,很好理解。
二、类B的继承与super的调用机制
类B通过class B < A继承了类A,所以它默认拥有A的所有方法,但它重写了method_1和method_2,这里的super就是用来调用父类中同名方法的关键。我们分两种情况看:
1. 类B的method_1:带显式参数的super
类B的method_1是无参数定义的,里面写了super("foo")——这里你显式传递了参数"foo",Ruby会直接把这个参数传给父类A的method_1(刚好父类的method_1需要一个参数)。
如果我们实例化B并调用inst_B.method_1(注意不需要传参,因为B的method_1是无参的),执行流程是:
- 进入B的
method_1方法 - 执行
super("foo"),跳转到父类A的method_1 - 父类A的
method_1接收参数"foo",输出对应字符串
2. 类B的method_2:同样带显式参数的super
类B的method_2也是无参数定义的,里面写了super("bar")——同样,显式传递的"bar"会被传给父类A的method_2。
当调用inst_B.method_2时,执行流程是:
- 进入B的
method_2方法 - 执行
super("bar"),跳转到父类A的method_2 - 父类A的
method_2接收参数"bar",并调用自身的method_1把参数传进去 - 最终输出
Using method_1 with argument value 'bar'
额外补充:Ruby中super的两种写法差异
这里要划个重点,Ruby里super有两种容易混淆的写法:
super(不带括号):会自动把当前方法收到的所有参数传递给父类的同名方法super()(带空括号):默认不会传递任何参数,除非你像代码里那样显式写进去参数(比如super("foo"))
举个例子,如果B的method_2改成这样:
def method_2(arg) super end
那调用inst_B.method_2("test")时,super会自动把"test"传给父类A的method_2,效果和你写super(arg)完全一样。
三、核心总结
- 类A的执行就是普通的方法调用,
method_2本质是个参数转发器,把收到的参数传给method_1 - 类B通过
super调用父类的同名方法时,显式传参的情况下,父类方法会直接接收你传递的参数,不管当前重写的方法有没有定义参数 - 一定要区分
super和super()的差异:前者自动传当前方法的参数,后者默认不传,需手动指定
内容的提问来源于stack exchange,提问作者Fabien Teulieres
相关产品推荐
相关产品推荐

