如何在ruby优化之间共享代码?

时间:2015-06-28 08:46:43

标签: ruby refinements

module Ext
  refine Hash do
    def foo
      puts :in_foo
    end
    def bar
      puts :in_bar
      foo
    end
  end
end
module Test
  using Ext
  Hash.new.bar
end
# in_bar
# in_foo
# => nil

这可以按预期工作。但是,如果我想使用foobarHash之间共享Arrayinclude,则会失败。

module Shared
  def foo
    puts :in_foo
  end
  def bar
    puts :in_bar
    foo
  end
end
module Ext
  refine Hash do
    include Shared
  end
  refine Array do
    include Shared
  end
end
module Test
  using Ext
  Hash.new.bar
end
# in_bar
# NameError: undefined local variable or method `foo' for {}:Hash

有没有办法在改进之间共享代码?

1 个答案:

答案 0 :(得分:0)

问题不在于分享。完全摆脱refine do ⇒ include细化,你会产生相同的行为。

相应于documentation

  

优化分别在文件末尾或eval字符串结尾处有效。   改进在范围上是词汇。当控制转移到范围之外时,细化被停用。这意味着,如果您需要或加载文件或调用在当前范围之外定义的方法,则将停用细化。

那就是说,你的例子中失败的是include。该语言尚未准备好理解refine子句中的$ref = lambda do def foo puts :in_foo end public :foo def bar puts :in_bar foo end public :bar end module Ext refine ::Hash do $ref.call end end module Test using Ext ::Hash.new.bar end #⇒ in_bar #⇒ in_foo 。也许将来有可能将该功能提升到“实验性”阶段。

如果你仍然认为你想要依赖refinemenet,你可能会欺骗ruby(全局变量是为了清晰起见):

Worker