Ruby 扩展对象 class

Ruby extend for object class

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

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>'

在这种情况下 class/eigenclass 放置方法 print 是什么?我怎样才能访问它?

这是因为你有 A class,而不是他们的扩展实例 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!"

至于为什么调用私有方法会报错 - Kernel#print 并且 Kernel 包含在 Object 中,因此默认情况下对象有一个私有的 [=14] =]方法。


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

a.singleton_class.print

至于如何为a扩展模块,查看


另请注意,即使您解决了此问题,您也会收到错误参数调用 #print 的错误,因为您将其重新定义为不带参数,但使用一个参数调用它。要在覆盖方法时调用原始实现,请使用 super.