如何描述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
答案 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,Foo
是Object
的一个实例(它是Class
的一个实例,它是一个Module
的子类,它是Object
)的子类。
Foo.new
是一个对象(它是Foo
的一个实例,它是Object
的子类。)
由于Foo
和Foo.new
都是Object
的实例,因此都会回复boo
。
[注意:我忽略了BasicObject
的存在。]