def main_method
new_array = []
some_array.each do |foo|
if (method_01? foo) || (method_02? foo) || (method_03? foo) || (method_04? foo) || (method_05? foo)
else
new_array << foo
end
end
end
有没有更好的方法来编写上面的代码而没有或(||)和没有elsif条件?
是通过适合这种重构的哈希循环吗?
答案 0 :(得分:2)
也许这样的事情会有所帮助吗?
我已经更新了我在两组上拆分数组的答案。
def main_method
methods = [:method1, :method2, :method3]
non_passed_elems, passed_elems = some_array.partition do |elem|
methods.none? do |method|
send(method, elem)
end
end
passed_elems.each{ |t| method_for_passed_elems(t) }
non_passed_elems.each{ |t| method_for_non_passed_elems(t) }
end
答案 1 :(得分:0)
在不知道具体用例的情况下,很难找到||
的替代品,但使用#reject
可以清理迭代次数:
def main_method
some_array.reject do |foo|
method_01?(foo) || method_02?(foo) # ... etc.
end
end
#reject
会将每个成员放到块中,并返回一个只包含返回false
的成员的数组。换句话说,只有将false
返回所有方法1-5的成员。
答案 2 :(得分:0)
更简洁的方式:
checkers = (1..5).map {|i| "method_%02d" % i} # too lazy ;)
new_array = some_array.select {|e| !checkers.any? {|m| e.send m}}
仍然相当可读&amp;明显。