簡體   English   中英

使用Ruby中的相同模塊多次擴展對象

[英]Extending an object multiple times with the same module in Ruby

給定一個Klass類和該類的一個實例k

class Klass
  def hello
    'Hello'
  end
end

k = Klass.new
k.hello        #=> "Hello"

我可以使用模塊extend該實例,以向該特定實例添加方法,而無需更改整個類(即所有實例):

module Mod
  def hello
    "#{super}, World!"
  end
end

k.extend(Mod)
k.hello        #=> "Hello, World!"

但是,如果我用同一模塊多次擴展k會發生什么?

k.extend(Mod)
k.extend(Mod)
k.extend(Mod)
k.hello        #=> "Hello, World!"

后續調用是否被忽略,或者對象被多次擴展?

換句話說,多次擴展對象是否“安全”?

我認為后續的調用將被忽略(除非您有更深的想法)。 以下結果在祖先列表中僅顯示一次Mod

class Klass; end
module Mod; end
k = Klass.new
k.extend(Mod)
k.extend(Mod)
k.extend(Mod)
k.singleton_class.ancestors
# => [#<Class:#<Klass:0x007f7787ef7558>>, Mod, Klass, Object, Kernel, BasicObject]

sawa 已經回答了實際的問題,但這也可能是相關的。 盡管Mod僅添加一次到對象(單個類)的祖先,但是每次都調用extended回調:

class Klass
end

module Mod
  def self.extended(mod)
    puts "#{self} extended in #{mod}"
  end
end

k = Klass.new
k.extend(Mod)
#=> "Mod extended in #<Klass:0x007fabbb029450>"
k.extend(Mod)
#=> "Mod extended in #<Klass:0x007fabbb029450>"
k.extend(Mod)
#=> "Mod extended in #<Klass:0x007fabbb029450>"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM