在 Ruby 精简块中组织一长段代码的最佳方式


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

当一个类被提炼为太多连接的方法时,我认为最好将它们提取到模块中。但是,在上面的示例中,当一种方法调用另一个方法时演示了一个问题(请参阅最后一个语句(,并且会产生以下错误。

在"start_end"中:未定义的局部变量或方法"last"表示"abcd":字符串(名称错误(

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

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

这是我

最终使用的一般模式。基本上,我找不到在某些级别使用全局标识符的解决方法。但这可以通过创建这些全局类/模块来相当干净地完成。作为一个例子,这将更加清楚:

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上的类方法不会导出到 using 。但是由于类/模块是常量(全局(,因此可以从任何地方访问它们。

相关内容

  • 没有找到相关文章

最新更新