如何在类外部实例方法声明在Ruby中工作?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

小六码奴 2019-04-10 16:20:44 808

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

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

Ruby
分享到
取消 提交回答
全部回答(1)
  • 小六码奴
    2019-07-17 23:33:08

    在任何类之外定义的方法都会添加到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方法。

    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题