我认为最简单的方法就是抛弃单个调用(不改变现有模块或创建新模块)如下:
Class.new.extend(UsefulThings).get_file
@AlbertCatalà根据我的测试和http://stackoverflow.com/a/23645285/54247匿名类是垃圾收集就像其他一切一样,所以它不应该浪费内存. (3认同)
dgtized.. 130
如果将模块上的方法转换为模块函数,则可以简单地将其从Mods中调用,就好像它已被声明为
module Mods def self.foo puts "Mods.foo(self)" end end
下面的module_function方法将避免破坏任何包含所有Mod的类.
module Mods def foo puts "Mods.foo" end end class Includer include Mods end Includer.new.foo Mods.module_eval do module_function(:foo) public :foo end Includer.new.foo # this would break without public :foo above class Thing def bar Mods.foo end end Thing.new.bar
但是,我很好奇为什么一组不相关的函数首先包含在同一个模块中?
编辑显示,如果public :foo
被调用后仍然有效module_function :foo
我认为最简单的方法就是抛弃单个调用(不改变现有模块或创建新模块)如下:
Class.new.extend(UsefulThings).get_file
如果将模块上的方法转换为模块函数,则可以简单地将其从Mods中调用,就好像它已被声明为
module Mods def self.foo puts "Mods.foo(self)" end end
下面的module_function方法将避免破坏任何包含所有Mod的类.
module Mods def foo puts "Mods.foo" end end class Includer include Mods end Includer.new.foo Mods.module_eval do module_function(:foo) public :foo end Includer.new.foo # this would break without public :foo above class Thing def bar Mods.foo end end Thing.new.bar
但是,我很好奇为什么一组不相关的函数首先包含在同一个模块中?
编辑显示,如果public :foo
被调用后仍然有效module_function :foo
如果您"拥有"该模块,另一种方法是使用它module_function
.
module UsefulThings def a puts "aaay" end module_function :a def b puts "beee" end end def test UsefulThings.a UsefulThings.b # Fails! Not a module method end test
如果要在不将模块包含在另一个类中的情况下调用这些方法,则需要将它们定义为模块方法:
module UsefulThings def self.get_file; ... def self.delete_file; ... def self.format_text(x); ... end
然后你可以打电话给他们
UsefulThings.format_text("xxx")
要么
UsefulThings::format_text("xxx")
但无论如何我建议你把相关的方法放在一个模块或一个类中.如果你有问题想要从模块中只包含一个方法,那么它听起来就像是一个糟糕的代码味道,将不相关的方法放在一起并不是很好的Ruby风格.
要在不包含模块的情况下调用模块实例方法(并且不创建中间对象):
class UsefulWorker def do_work UsefulThings.instance_method(:format_text).bind(self).call("abc") ... end end
首先,我建议将模块分解为您需要的有用的东西.但是你总是可以为你的调用创建一个扩展它的类:
module UsefulThings def a puts "aaay" end def b puts "beee" end end def test ob = Class.new.send(:include, UsefulThings).new ob.a end test