Ruby扩展为对象类

时间:2017-07-07 07:31:54

标签: ruby metaprogramming extends

为什么这段代码我有以下错误?

module ForExtend
  def print
    print "ForExtend print method!"
  end
end

class A
end

a = A.new

class << a
  extend ForExtend
end

a.print

结果:

private method `print' called for #<A:0x005607b26811f8>
(repl):16:in `<main>'

在这种情况下,什么类/特征类放置方法print?我该如何访问它?

2 个答案:

答案 0 :(得分:1)

这是因为你有A个课程,而不是他们的实例a

module ForExtend
  def print
    puts "ForExtend print method!"
  end
end

class A; end

a = A.new
a.extend ForExtend # ⇐ THIS WILL EXTEND a

a.print
#⇒ "ForExtend print method!"

答案 1 :(得分:1)

至于为什么你收到调用私有方法的错误 - Kernel#print中包含KernelObject,因此默认情况下对象具有私有#print方法

至于这种方法在这种情况下的位置 - 它是a上单例类的类方法:

a.singleton_class.print

至于如何扩展a的模块,请检查@mudasobwa's answer

另请注意,即使您解决了这个问题,在重新定义参数时也会因错误数量的参数调用#print而导致错误,因为您重新定义了参数,而不是参数。要在覆盖方法时调用原始实现,请使用super