可以将类方法添加到Ruby对象的某些实例中而不是其他实例吗?

时间:2012-04-20 01:05:48

标签: ruby module object-model

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

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.classxyc2.class没有?我没有看到颠覆方法查找的简单方法。

3 个答案:

答案 0 :(得分:2)

而不是c1.class.x,为什么不像Law Of Demeter建议的那样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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

也许这个

c1.extend(M)

c1.methods & [:x, :y] #=> [:x, :y]
c2.methods & [:x, :y] #=> []