2010-03-10 47 views
2

有沒有一種漂亮的方法來在ruby中進行一系列方法調用直到一個返回true?紅寶石:調用方法列表,直到一個返回true

這是我的第一個想法,但想有可能是一個更好的方式:如果方法之一返回true否則返回none worked

[:m1, :m2, :m3, ...].find{ |m| send(m) } != nil || "none worked" 

返回true

if method_one 
elsif method_two 
elsif method_three 
else 
    puts "none worked" 
end 

回答

5

您可以使用可枚舉#否?以及。

[ :m1, :m2, :m3 ].any?{ |method| object.send(method)} || "None Worked" 
+0

這是我認爲最優雅,正是我尋找的方法(任何?) – 2010-03-12 08:00:52

4

試試這個。

+0

不錯!我喜歡這個 – 2010-03-10 06:51:55

+0

此外,從技術上講,即使其中一個方法返回true,也會運行所有*方法。它可以很容易地修改,如:[:m1,:m2,:m3,...] find {| m |返回如果發送(米)}'或類似的東西。 – 2010-03-10 06:53:42

+0

我測試了代碼,它按預期工作。只要方法成功時返回'non nil'值/'true',失敗時返回'nil' /'false',代碼應該工作。 – 2010-03-10 07:33:01

5

有許多Ruby-ish選項。一個有趣的是:

method_one || method_two || method_three || Proc.new { puts "none worked" }.call 

method_one || method_two || method_three || lambda { puts "none worked" }.call 
+0

沒有必要甚至使用這種技術的proc/lambda。 'method_one || method_two || 「沒有工作」' – 2010-03-10 05:29:39

+0

是的,該過程只是一個不錯的額外我認爲 – 2010-03-10 06:52:20

+0

@Jimmy,用你提供的表達式的代碼將返回'false','true'或'「none working」'這是不一樣的OP問道。你不能在'puts'前加上全部,因爲它也會打印布爾值。 – 2010-03-10 07:34:49