You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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是无参的),执行流程是:

  1. 进入B的method_1方法
  2. 执行super("foo"),跳转到父类A的method_1
  3. 父类A的method_1接收参数"foo",输出对应字符串

2. 类B的method_2:同样带显式参数的super

类B的method_2也是无参数定义的,里面写了super("bar")——同样,显式传递的"bar"会被传给父类A的method_2。
当调用inst_B.method_2时,执行流程是:

  1. 进入B的method_2方法
  2. 执行super("bar"),跳转到父类A的method_2
  3. 父类A的method_2接收参数"bar",并调用自身的method_1把参数传进去
  4. 最终输出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:15:10