super.是什么意思?在红宝石中做什么?

发布于 2024-11-15 19:18:35 字数 794 浏览 0 评论 0原文

使用以下代码:

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

With the following code:

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

Running ObjB.new.func results in:

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

I understand what super does - it calls the current method on the superclass. include Mod makes Mod the next superclass so Mod#func is called.

However, what is super.func doing? I thought it would be equivalent to super, but while it does print out the same output, it also throws a NoMethodError.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

空气里的味道 2024-11-22 19:18:35

我假设 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

I assume super.func would do the same thing as any form of method chaining. It calls super, and then calls func on the result returned by super.

The super part would call Mod#func, which prints out "Mod", then calls func on the return value of Mod#func, ie nil (that's because puts returns nil). As nil doesn't have a func method, it says

NoMethodError: undefined method `func' for nil:NilClass
    from test.rb:19:in `func'
    from (irb):2
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文