开发者社区 问答 正文

如何在类外部实例方法声明在Ruby中工作?

下面的代码实际上是如何工作的?

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, #

展开
收起
小六码奴 2019-04-10 16:20:44 2360 分享
分享
版权
举报
1 条回答
写回答
取消 提交回答
  • 在任何类之外定义的方法都会添加到Object类中,该类是Struct祖先之一(即Struct继承所有Object方法)。

    在新的irb会话中尝试这个:

    self.class

    => Object

    self.respond_to?(:foo)

    => false

    def foo
    "foo"
    end

    => :foo

    self.respond_to?(:foo)

    => true

    在提供的示例中,您创建了一个实例Klass(包括Struct并包含Object在其祖先链中),因此在Klass创建新实例时,它包括所有Object方法,包括新foo方法。

    2019-07-17 23:33:08 举报
    赞同 评论

    评论

    全部评论 (0)

    登录后可评论
问答分类:
问答标签:
问答地址:
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等