2016-08-02 25 views
1

我發現自己做這個很多,以防止零當返回some_method返回零。替換三元零檢查與紅寶石的最佳做法

a = a.some_method.present? ? a.some_method : [] 

有沒有更紅寶石的方式來做到這一點?我已經使用

a = [] 
a ||= a.some_method 

但ofcourse試圖將只給我

a = [] 

的感謝!

+1

'a = a.some_method || []' – Hamms

回答

1

通常的模式是:

result = method(args) || default_value 

||操作者是短路。如果左側爲假,則不會費心評估右側。在Ruby中,nil被認爲是錯誤的。因此,如果返回nil(或false),則||將評估右側並作爲結果返回。

注意左側和右側的順序很重要。

0

如果您發現自己需要三次或兩次以上相同方法的ternany或類似模式,您可能需要考慮引入一個「安全」變體。

class A 

    def some_method 
    nil 
    end 

    def some_method_safe 
    if value = self.some_method 
     value 
    else 
     [] 
    end 
    end 

end 

A.new.some_method_safe # => [] 
0

想必你some_method會返回一個數組或nil。如果some_method是其他任何不是present?'',false,{},[],nil),那麼你有一個非常奇怪的界面在你的手中。我認爲!x.present?投射了一個比你需要的更寬的網。

我猜你的邏輯實在是更像是:

x = a.some_method 
x = [ ] if(x.nil?) 

所以你真正想要做的是把nil爲空數組並獨自離開的數組。 Array#to_aNilClass#to_a到正是這樣,你可以簡單地說:

x = a.some_method.to_a 

的問題Array#to_a是,它不處理Array子那麼好,但是這是一個非常罕見的問題。

在某些情況下「不存在」的意思nil,在別人就意味着0''[ ],......所以我們有便捷to_Xpresence方法方便地躲在方法調用的差異。

1

你已經有了一些很好的答案。另一種方法 - 如果這是您自己的代碼中的問題 - 則可以在Ruby的標準庫之後爲您的類建模,例如, Hash#fetch,所以用戶可以提供一個表達式作爲默認值。

class Whatever 
    def some_method 
    result = nil # normally this would be computed 
    return result unless result.nil? 
    yield if block_given? 
    end 
end 

nil?明確檢查的原因是情況result可以合法false。如果你不關心這個,或者你知道它不會發生任何改變的情況(例如unless result)。

用法:

Whatever.new.some_method 
#=> nil 
Whatever.new.some_method { [] } 
#=> [] 
Whatever.new.some_method { 1 + 1 } 
#=> 2 

我個人認爲這是明確的安全包裝一個更好的替代方案,在這個線程別處建議。

0

據我所知,a.some_method返回一個數組或nil,並且如果nil您希望它返回一個空數組。如果這是正確的,你可以寫:

a.some_method.to_a 

如果a.some_method返回數組arrarr.to_a #=> arr。 (見Array#to_a。)

如果a.some_method返回nil,nil.to_a #=> []。 (請參閱NilClass#to_a)。