2013-10-07 37 views
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 

有沒有更好的方法來編寫上面的代碼沒有or(||)和沒有elsif條件?重構elsif else或Ruby塊

循環通過適合這種重構的哈希?

+0

每種方法(method_01 ?, method_02?...)都包含一個計算,它編輯'foo',並在沒有任何方法匹配的情況下返回'new_array',然後將該元素添加到'new_array'中。 –

+1

It定義具有副作用的問題標記方法是非常實際的做法,即哪些方法會改變其局部方法範圍之外的數據。這通常是意想不到的,並且可能會在以後給你帶來很多悲傷。 –

回答

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

它看起來像你顛倒了邏輯。我認爲他想要所有的方法都沒有返回true的元素。 '[false,false] .select {| e | \t [:method01,:method02] .none? {| M |發送(m,e)}}' –

+0

在完成對函數的所有調用之後,如何處理'else'部分? –

+1

@JonasElfström是對的,你需要使用'any?'而不是'none?'。 –

0

這將是很難拿出一個替代||•不用知道你的具體使用情況,但迭代可以清理使用#reject一個很好的協議:

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

#reject將產生每個成員並返回一個只包含返回false的成員的數組。換句話說,只有方法1-5返回false全部的成員。

+0

這是否仍然具有複雜性,因爲它在塊內部包含「||」?以及它將如何處理'else'條件?謝謝! –

+0

你的例子中的'else'條件是空的,所以我想你不需要它。 您的代碼的複雜程度將至少與您的要求一樣複雜。而你的要求似乎是返回一個數組,其中成員返回'false'到所有5種方法。你需要在所有這些結果的地方「||」,所以要明確它! – rickyrickyrice

0

更簡潔的方式:

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

還是蠻可讀&明顯。