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
.
为什么我的这段代码有以下错误?
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
.