在编写Ruby方法来生成一串非重复字符的排列时偶然发现了这一点:
class String
def permutations
@result_array = []
recurse( "", self.each_char.to_a )
@result_array
end
def recurse( prepend_character, sub_array )
sub_array.each{ |c|
recurse( prepend_character + c, sub_array - [c] )
}
@result_array << prepend_character if sub_array.empty?
end
end
p "abc".permutations # prints: ["abc", "acb", "bac", "bca", "cab", "cba"]
正在考虑在核心类中创建一个属性并保存数据是否合适或建议。有什么想法可以避免创建属性来实现这一点(不使用全局变量)?
忽略可以对逻辑进行的改进,以下是在不向类中添加不必要的实例变量或函数的情况下重写它的方法:
class String
def permutations
result = []
recurse = lambda do |pre, sub|
sub.each { |c| recurse[pre + c, sub - [c]] }
result << pre if sub.empty?
end
recurse['', each_char.to_a]
result
end
end
'abc'.permutations
如果您不了解您的工具,则不应更改核心类。这只能由确切知道正在发生的事情的人来完成。
所以我的建议是:在你真的必须这样做之前不要这样做。
核心 Ruby 中几乎所有内容都有解决方案:
"abc".split('').permutation.map(&:join)
=> ["abc", "acb", "bac", "bca", "cab", "cba"]