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' for" abcd":String(NameError)
使用全局变量解决了类似的issue,这也适用于我的示例。但是,我正在寻找另一种更好的方法来组织被称为精炼的方法并避免全局化。
如何建议更好的方法来组织这些方法?
答案 0 :(得分:3)
这是我最终使用的一般模式。基本上我没有找到在某种程度上使用全局标识符的解决方法。但是这可以通过制作那些全局类/模块来相当干净地完成。作为一个例子,这将更加清晰:
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
。但由于类/模块是常量(全局变量),因此可以从任何地方访问它们。