尝试使用Ruby super直接调用方法

Jas*_*son 1 ruby

考虑以下代码:

class Hello
  def hi
    puts "Hello"
  end
end

class HelloWorld < Hello
  def hi
    super.hi
    puts "World"
  end
end

HelloWorld.new.hi
Run Code Online (Sandbox Code Playgroud)

给出输出:

$ ruby super.rb
Hello
super.rb:9:in `hi': undefined method `hi' for nil:NilClass (NoMethodError)
    from super.rb:14:in `<main>'
Run Code Online (Sandbox Code Playgroud)

为什么Hello打印出来?我希望得到错误.此外,我知道我真正应该做的只是打电话super而不是,super.hi但我想了解"引擎盖下"正在发生的事情.

Jor*_*eña 7

super已经自动调用被覆盖的方法.什么情况是,hiHello回报率nil,因为它根本puts返回nil(和它的最后一个表达式).所以Ruby求值super,调用该方法,然后它尝试hi从结果nil对象访问该方法,并且没有.