在Ruby中這樣做的正確方法是什麼?Ruby成語:方法調用或其他默認值
def callOrElse(obj, method, default)
if obj.respond_to?(method)
obj.__send__(method)
else
default
end
end
在Ruby中這樣做的正確方法是什麼?Ruby成語:方法調用或其他默認值
def callOrElse(obj, method, default)
if obj.respond_to?(method)
obj.__send__(method)
else
default
end
end
因爲它沒有被提出作爲一個答案:
result = obj.method rescue default
與@slhck,我可能不會用這個當我知道有obj不會迴應方法的合理機會,但它是一種選擇。
,我可能會去
obj.respond_to?(method) ? obj.__send__(method) : default
這更清潔,但本質上是相同的功能。我認爲這樣做會有更好的方式。 – dsg 2011-01-30 08:32:03
所以,你要類似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"
也許你不喜歡這種間接調用符號?沒問題,那就看Ick的maybe
風格和使用代理對象(你可以計算出實現):
p "hello".maybe_has_method.not_existing || "default" # "default"
附註:我不是面向對象的專家,但它是我的理解是,你應該知道你所調用的對象確實有這樣的方法。或者是nil
你想控制的對象不發送方法到? IM這種情況下伊克已經是一個很好的解決方案:object_or_nil.maybe.method || default
EAFP(即使用try-except here)是否被Pythonistas包含在Ruby社區中? – 2011-01-30 09:46:50
@Karl。我不是爲所有的Rubyist人員談論的,但是爲了你能做的事情而編寫(至少)四行代碼對於許多Ruby程序員來說絕對是煩人的(儘管他們可能不介意Python)。 – tokland 2011-01-30 09:57:00
此外,如果OP打算包含__default__行爲,我不會在這裏使用try/except構造。在我看來,如果兩種方式(即`send`和`default`)都可以發生,爲什麼要使它成爲「例外」? – slhck 2011-01-30 10:01:53