0
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 条件的上述代码?

通过散列循环是否适合这种重构?

4

3 回答 3

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
于 2013-10-07T05:58:25.887 回答
0

在不知道您的具体用例的情况下很难想出||s 的替代方案,但是可以使用以下方法清理迭代#reject

def main_method
  some_array.reject do |foo|
    method_01?(foo) || method_02?(foo) # ... etc.
  end
end

#reject将产生每个成员到块并返回一个仅包含返回的成员的数组false。换句话说,只有返回false所有方法1-5 的成员。

于 2013-10-07T05:40:08.093 回答
0

更简洁的方式:

checkers = (1..5).map {|i| "method_%02d" % i}  # too lazy ;)
new_array = some_array.select {|e| !checkers.any? {|m| e.send m}}

仍然非常可读和明显。

于 2013-10-07T12:01:27.350 回答