下面的代码实际上是如何工作的?
class Klass < Struct.new(:x, :y, :z)
end
public
def foo
bar
end
def inspect
"Can't override inspect -> #{self.class}"
end
private
def bar
[x, y, z]
end
def baz
send(:class)
end
obj = Klass.new(1, 2, 3)
p obj.foo # => [1, 2, 3]
p obj # => #
p Klass.ancestors # => [Klass, #
在任何类之外定义的方法都会添加到Object类中,该类是Struct祖先之一(即Struct继承所有Object方法)。
在新的irb会话中尝试这个:
self.class
self.respond_to?(:foo)
def foo
"foo"
end
self.respond_to?(:foo)
在提供的示例中,您创建了一个实例Klass(包括Struct并包含Object在其祖先链中),因此在Klass创建新实例时,它包括所有Object方法,包括新foo方法。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。