【问题标题】:What does super.<method-name> do in ruby?super.<method-name> 在 ruby​​ 中做了什么?
【发布时间】:2011-06-16 03:14:47
【问题描述】:

使用以下代码:

class ObjA
    def func
        puts "ObjA"
    end
end

module Mod
    def func
        puts "Mod"
    end
end

class ObjB < ObjA
    include Mod
    def func
        puts "super called"
        super
        puts "super.func called"
        super.func
    end
end

运行ObjB.new.func 会导致:

ruby-1.9.2-p180 :002 > ObjB.new.func
super called
Mod
super.func called
Mod
NoMethodError: undefined method `func' for nil:NilClass
    from test.rb:19:in `func'
    from (irb):2

我了解super 的作用——它调用超类的当前方法。 include Mod 使 Mod 成为下一个超类,因此调用了 Mod#func

但是,super.func 在做什么?我认为它等同于super,但是虽然它确实打印出相同的输出,但它也会抛出一个NoMethodError

【问题讨论】:

    标签: ruby super


    【解决方案1】:

    我假设super.func 会做与任何形式的方法链接相同的事情。它调用super,然后对super返回的结果调用func

    super 部分会调用Mod#func,它会打印出“Mod”,然后在Mod#func 的返回值上调用func,即nil(这是因为puts 返回nil)。由于 nil 没有 func 方法,它说

    NoMethodError: undefined method `func' for nil:NilClass
        from test.rb:19:in `func'
        from (irb):2
    

    【讨论】:

    • 谢谢,这解释了它(我通过在 Mod#func 方法的末尾添加 ObjA.new 进行测试 - 它不会导致方法错误并打印出 ObjA)。
    猜你喜欢
    • 2011-01-24
    • 1970-01-01
    • 2013-11-13
    • 2019-07-24
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多