Object类中定义的方法同时是实例和类1

时间:2017-07-04 20:11:35

标签: ruby

如何描述Object类中定义的方法 boo 在类 Foo 中同时成为实例和第一类?

class Foo; end

class Object
  def boo
    'boo method'
  end
end

p Foo.boo # => boo method
p Foo.new.boo # => boo method

3 个答案:

答案 0 :(得分:1)

如果你真的想这样做,请记住,类上下文和实例上下文完全不同,因此实例变量不等效。

module FooMethods
  def boo
    'boo'
  end
end

class Foo
  extend FooMethods
  include FooMethods
end

故意通过extend和实例级别include在类级别导入mixin。

答案 1 :(得分:1)

也许将方法转发到self是一种选择?

require 'forwardable'

class Foo
  extend Forwardable

  def self.boo
    'boo method'
  end

  def_delegator self, :boo
end

Foo.boo
#=> "boo method"

Foo.new.boo
#=> "boo method"

答案 2 :(得分:1)

每个对象都是Object的实例。因此,每个对象都会响应boo

Foo是一个对象(类也是对象),ergo,FooObject的一个实例(它是Class的一个实例,它是一个Module的子类,它是Object)的子类。

Foo.new是一个对象(它是Foo的一个实例,它是Object的子类。)

由于FooFoo.new都是Object的实例,因此都会回复boo

[注意:我忽略了BasicObject的存在。]