Tag: 改进

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

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 这按预期工作。 但是如果我想通过使用include在Hash和Array之间共享foo和bar ,它就会失败。 module Shared def foo puts :in_foo end def bar puts :in_bar foo end end module Ext refine Hash do include Shared […]

分层次地使用细化

精化是对v2.0的实验性补充,然后在v2.1中进行了修改并永久化。 它提供了一种通过提供“在本地扩展类的方法”来避免“猴子修补”的方法。 我试图将Refinements应用于最近的这个问题 ,我将简化这个问题 : a = [[1, “a”], [2, “b”], [3, “c”], [4, “d”]] b = [[1, “AA”], [2, “B”], [3, “C”], [5, “D”]] 如果出现以下情况, b中偏移量i处的元素与b中偏移量i处的元素匹配: a[i].first == b[i].first 和 a[i].last.downcase == b[i].last.downcase 换句话说,字符串的匹配与大小写无关。 问题是确定与b的相应元素匹配的元素的数量。 我们看到答案是两个,即偏移1和2处的元素。 一种方法是使用猴子补丁String#== : class String alias :dbl_eql :== def ==(other) downcase.dbl_eql(other.downcase) end end a.zip(b).count { |ae,be| ae.zip(be).all? { |aee,bee| […]

将ruby类转换为模块比使用优化更好的方法?

Module#refine方法接受一个类和一个块并返回一个细化模块,所以我想我可以定义: class Class def include_refined(klass) _refinement = Module.new do include refine(klass) { yield if block_given? } end self.send :include, _refinement end end 并且以下测试通过 class Base def foo “foo” end end class Receiver include_refined(Base) { def foo “refined ” + super end } end describe Receiver do it { should respond_to(:foo) } its(:foo) { should eq(“refined […]