如果elsif else或在Ruby块中重构 def main_方法 新的_数组=[] 有些是数组,每个都是foo| 如果(方法01?foo)| |(方法02?foo)| |(方法03?foo)| |(方法04?foo)| |(方法05?foo) 其他的 新的_数组

如果elsif else或在Ruby块中重构 def main_方法 新的_数组=[] 有些是数组,每个都是foo| 如果(方法01?foo)| |(方法02?foo)| |(方法03?foo)| |(方法04?foo)| |(方法05?foo) 其他的 新的_数组,ruby,refactoring,Ruby,Refactoring,在不了解您的具体用例的情况下,很难找到替代|的方法,但是可以使用#reject对迭代进行大量清理: def main_method some_array.reject do |foo| method_01?(foo) || method_02?(foo) # ... etc. end end #reject将向块生成每个成员并返回一个数组,该数组仅包含返回false的成员。换句话说,只有那些将false返回到所有方法1-5的成员。这样做可能会有帮助吗 我已经更新了在两组上拆分数

在不了解您的具体用例的情况下,很难找到替代
|
的方法,但是可以使用
#reject
对迭代进行大量清理:

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

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

这样做可能会有帮助吗

我已经更新了在两组上拆分数组的答案

更简洁的方式:

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

仍然非常可读和明显。

这不是仍然有圈复杂度吗,因为它在块中包含
|
?它将如何处理
else
条件?非常感谢。在您的示例中,
else
条件为空,因此我认为您不需要它。代码的复杂性至少与您的需求一样复杂。您的要求似乎是返回一个数组,其中成员向所有5个方法返回
false
。您需要在某个地方
|
所有这些结果,所以请明确说明!看起来你颠倒了逻辑。我认为他想要所有的元素,其中没有一个方法返回true<代码>[false,false]。选择{e}[:method01,:method02]。无?{m | send(m,e)}在所有函数调用完成后,您如何处理
else
部分?@JonasElfström是正确的,您需要使用
any?
而不是
none?
@БааСа而不是创建一个新数组。这会过滤原始数组以返回您正在查找的元素。这是一个更为惯用的Ruby。每个方法(方法01?、方法02?…)都包含一个计算,该计算编辑
foo
,并将其添加回
new\u数组
,如果没有匹配的方法,则将元素添加到
new\u数组
定义具有副作用的问号方法实际上是一种实践,即,在其本地方法范围之外更改数据。这通常是出乎意料的,可能会在以后给你带来很多悲伤。
checkers = (1..5).map {|i| "method_%02d" % i}  # too lazy ;)
new_array = some_array.select {|e| !checkers.any? {|m| e.send m}}