-1

这是一个包含一些方法的模块:

module M
  def x; y; end
  def y; ...; end
end

这是一个类:

class C
  def z; ...; end
end

我有两个实例C

 c1 = C.new
 c2 = C.new

有什么我可以做的c1c1.classxy,但c2.class没有?我没有看到颠覆方法查找的直接方法。

4

3 回答 3

2

正如得墨忒耳法则所暗示的,与其做,不如做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
于 2012-04-20T01:47:38.400 回答
0

您可以覆盖c1.class以返回 C 以外的其他内容(而其他内容将扩展 M)。除此之外,没有。

请注意,覆盖c1.class几乎肯定是一个坏主意。一个对象不应该谎报它的类是什么。

于 2012-04-20T01:09:38.560 回答
0

也许这

c1.extend(M)

c1.methods & [:x, :y] #=> [:x, :y]
c2.methods & [:x, :y] #=> []
于 2012-04-20T01:17:12.820 回答