在 ruby 细化块中组织长代码的最佳方式

best way to organize a long piece of code in ruby refinement block

module Access
  def last
    self[-1]
  end

  def start_end
    self[0] + last
  end
end

module StringExt
  refine String do
    include Access
  end
end

using StringExt

puts 'abcd'.last       # => d
puts 'abcd'.start_end

当一个 class 被太多连接的方法细化时,我认为最好将它们提取到一个模块中。但是,在上面的示例中,当一个方法调用另一个方法时出现问题(请参阅最后一条语句),并产生以下错误。

in 'start_end': 未定义局部变量或方法 'last' for "abcd":String (NameError)

类似的 issue 是使用全局变量解决的,这也适用于我的示例。但是我正在寻找另一种更好的方法来组织正在改进的调用间方法并避免全局的事情。

如何更好地组织这些方法?

这是我最终使用的一般模式。基本上我没有找到在某种程度上使用全局标识符的解决方法。但这可以通过使这些全局变量 classes/modules 相当干净地完成。举个例子会更清楚:

module StringPatches

  def self.non_empty?(string)
    !string.empty?
  end

  def non_empty?
    StringPatches.non_empty?(self)
  end

  def non_non_empty?
    !StringPatches.non_empty?(self)
  end

  refine String do
    include StringPatches
  end

end

class Foo
  using StringPatches
  puts "asd".non_empty? # => true
  puts "asd".non_non_empty? # => false
end

StringPatches 上的 class 方法不会导出到 using。但由于 classes/modules 是常量(全局变量),因此可以从任何地方访问它们。