这是一个包含一些方法的模块:
module M
def x; y; end
def y; ...; end
end
这是一个类:
class C
def z; ...; end
end
我有两个实例C
:
c1 = C.new
c2 = C.new
有什么我可以做的c1
,c1.class
有x
和y
,但c2.class
没有?我没有看到颠覆方法查找的直接方法。
这是一个包含一些方法的模块:
module M
def x; y; end
def y; ...; end
end
这是一个类:
class C
def z; ...; end
end
我有两个实例C
:
c1 = C.new
c2 = C.new
有什么我可以做的c1
,c1.class
有x
和y
,但c2.class
没有?我没有看到颠覆方法查找的直接方法。
正如得墨忒耳法则所暗示的,与其做,不如做c1.class.x
,何乐而不为呢?c1.x
class C
def self.x
"hi"
end
end
c1 = C.new
c2 = C.new
def c1.x
self.class.x
end
c1.x # => "hi"
c2.x # NoMethodError
您可以覆盖c1.class
以返回 C 以外的其他内容(而其他内容将扩展 M)。除此之外,没有。
请注意,覆盖c1.class
几乎肯定是一个坏主意。一个对象不应该谎报它的类是什么。
也许这
c1.extend(M)
c1.methods & [:x, :y] #=> [:x, :y]
c2.methods & [:x, :y] #=> []