开发者社区> 问答> 正文

如何在类外部实例方法声明在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 2348 0
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
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
继承与功能组合 立即下载
编程语言如何演化—— 以 JS 的 private 为例 立即下载
编程语言如何演化-以JS的private为例 立即下载