extend和extend_object钩子有什么区别

时间:2018-11-14 12:25:57

标签: ruby

有人可以解释extend和extend_object钩子之间的区别。互联网上没有适当的文档。

2 个答案:

答案 0 :(得分:3)

实质上,extend_object是执行扩展的方法。您可以覆盖它,例如在扩展发生之前创建类型检查:

module Foo
  def self.extend_object(obj)
    raise(TypeError, "No strings!") if obj.is_a?(String)
    super # need to call super or object
          # won't be extended
  end

  def self.extended(obj)
    puts "#{obj.inspect} was extended with #{self}"
  end
end

1.extend(Foo)
"1".extend(Foo) # raises TypeError: No strings!

答案 1 :(得分:0)

extend_objectextend使用的私有API方法,它添加了模块常量和方法

  

extend_object(p1) private

     

通过添加此模块的常量和方法(作为单例方法添加)来扩展指定的对象。这是Object#extend使用的回调方法。

https://apidock.com/ruby/Module/extend_object

extended只是一个回调,开发人员可以在扩展模块时使用其运行特定代码。 https://ruby-doc.org/core-2.2.0/Module.html#method-i-extended