2011-01-30 65 views
5

在Ruby中這樣做的正確方法是什麼?Ruby成語:方法調用或其他默認值

def callOrElse(obj, method, default) 
    if obj.respond_to?(method) 
    obj.__send__(method) 
    else 
    default 
    end 
end 
+0

EAFP(即使用try-except here)是否被Pythonistas包含在Ruby社區中? – 2011-01-30 09:46:50

+0

@Karl。我不是爲所有的Rubyist人員談論的,但是爲了你能做的事情而編寫(至少)四行代碼對於許多Ruby程序員來說絕對是煩人的(儘管他們可能不介意Python)。 – tokland 2011-01-30 09:57:00

+0

此外,如果OP打算包含__default__行爲,我不會在這裏使用try/except構造。在我看來,如果兩種方式(即`send`和`default`)都可以發生,爲什麼要使它成爲「例外」? – slhck 2011-01-30 10:01:53

回答

3

因爲它沒有被提出作爲一個答案:

result = obj.method rescue default 

與@slhck,我可能不會用這個當我知道有obj不會迴應方法的合理機會,但它是一種選擇。

2

,我可能會去

obj.respond_to?(method) ? obj.__send__(method) : default 
+0

這更清潔,但本質上是相同的功能。我認爲這樣做會有更好的方式。 – dsg 2011-01-30 08:32:03

3

所以,你要類似x = obj.method || default的東西嗎?紅寶石是建立自己的自下而上的結構的理想語言:

class Object 
    def try_method(name, *args, &block) 
    self.respond_to?(name) ? self.send(name, *args, &block) : nil  
    end 
end 

p "Hello".try_method(:downcase) || "default" # "hello" 
p "hello".try_method(:not_existing) || "default" # "default" 

也許你不喜歡這種間接調用符號?沒問題,那就看Ickmaybe風格和使用代理對象(你可以計算出實現):

p "hello".maybe_has_method.not_existing || "default" # "default" 

附註:我不是面向對象的專家,但它是我的理解是,你應該知道你所調用的對象確實有這樣的方法。或者是nil你想控制的對象不發送方法到? IM這種情況下伊克已經是一個很好的解決方案:object_or_nil.maybe.method || default