簡體   English   中英

如何從 Ruby 模塊中僅導入幾個函數?

[英]How can I import only a couple of functions from a Ruby module?

假設我有一個帶有方法的模塊:function1、function2、function3。 我想導入 function1 和 function2 但不是 function3。 有沒有辦法在 ruby 中做到這一點?

不確定是否有一種干凈的方法來添加您想要的方法,但您可以使用undef_method刪除您不想要的方法。

module Foo
  def function1
  end

  def function2
  end

  def function3
  end
end

module MiniFoo
  include Foo
  not_wanted_methods = Foo.instance_methods - %w(function1 function2)
  not_wanted_methods.each {|m| undef_method m}
end

class Whatever
  include MiniFoo
end

類似的解決方案,但更自動化。 我不知道會發生什么樣的奇怪事情。

module Foo
  def m1
    puts "Hello from m1"
  end

  def m2
    puts "Hllo from m2"
  end
end

class Module
  alias :__include__ :include
  def include(mod, *methods)
    if methods.size > 0
        tmp  = mod.dup
        new_mod = Object.const_set("Mod#{tmp.object_id}", tmp)
        toremove = new_mod.instance_methods.reject { |m| methods.include? m.to_sym }
        toremove.each { |m| new_mod.send(:undef_method, m) }
        __include__(new_mod)
    else
      __include__(mod)
    end
  end
end

class Bar
  include Foo
end

class Baz
  include Foo, :m2
end

bar = Bar.new
baz = Baz.new
p bar.methods - Object.methods
p baz.methods - Object.methods

=>

["m1", "m2"]
["m2"]

假設您控制模塊的源代碼,我認為最簡潔的方法是將模塊拆分為更多,呃,模塊化的部分。

如果您只想要模塊的某些部分,這是一個很好的跡象,表明您可以將該模塊重構為多個責任較小的模塊。

暫無
暫無

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

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