有沒有一個很好的辦法如何寫:安全地調用方法
a = one.two.three.four
其中,「一」 - 分配,「二」 - 零。這個聲明是個例外。
如果「2」,「3」,「4」中的任何一個爲零,我想要有「a」零,否則在「a」中具有「四」的結果。
是否可以在不寫條件語句的情況下做到這一點?
有沒有一個很好的辦法如何寫:安全地調用方法
a = one.two.three.four
其中,「一」 - 分配,「二」 - 零。這個聲明是個例外。
如果「2」,「3」,「4」中的任何一個爲零,我想要有「a」零,否則在「a」中具有「四」的結果。
是否可以在不寫條件語句的情況下做到這一點?
a = one.try(:two).try(:three).try(:four)
首先,你需要知道這段代碼是否違反了Law of Demeter。如果是這樣的話,那麼正確的解決這個問題的辦法就是這樣寫不代碼。
你會如何發現它是否被破壞? Here是一篇試圖解釋如何適用於Ruby語言的文章。
在你的情況下,你會把它分解成多個調用,其中有警戒子句。在電話one.two.three.four
中,我們可以假設four
是three
(而不是three
返回的對象)的屬性。並且three
將是two
的財產。所以,你會在two
添加一個方法:
# Note: This is an over-simplified example
def three_four
return unless three
three.four
end
而且在one
你會:
def two_three_four
return unless two
two.three_four
end
更相關的例子:
invoice.customer.primary_address.zipcode
所以,你將有Customer#primary_address_zipcode
和Invoice#customer_primary_address_zip_code
(或更好的縮寫名稱,這會更有意義)
如何寫: a = one.two.three(param)[:c] – Jonas
-1。我認爲'try'在像這樣的方法鏈中使用時是一種代碼異味。雖然它*是'*安全調用方法*'的解決方案,但安全調用像OP一樣鏈接在一起的方法已經發布的想法是不正確的,IMO。 – Swanand
是不是嘗試導軌方法? –