我發現自己做這個很多,以防止零當返回some_method返回零。替換三元零檢查與紅寶石的最佳做法
a = a.some_method.present? ? a.some_method : []
有沒有更紅寶石的方式來做到這一點?我已經使用
a = []
a ||= a.some_method
但ofcourse試圖將只給我
a = []
的感謝!
我發現自己做這個很多,以防止零當返回some_method返回零。替換三元零檢查與紅寶石的最佳做法
a = a.some_method.present? ? a.some_method : []
有沒有更紅寶石的方式來做到這一點?我已經使用
a = []
a ||= a.some_method
但ofcourse試圖將只給我
a = []
的感謝!
通常的模式是:
result = method(args) || default_value
的||
操作者是短路。如果左側爲假,則不會費心評估右側。在Ruby中,nil
被認爲是錯誤的。因此,如果返回nil
(或false
),則||
將評估右側並作爲結果返回。
注意左側和右側的順序很重要。
如果您發現自己需要三次或兩次以上相同方法的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 # => []
想必你some_method
會返回一個數組或nil
。如果some_method
是其他任何不是present?
(''
,false
,{}
,[]
,nil
),那麼你有一個非常奇怪的界面在你的手中。我認爲!x.present?
投射了一個比你需要的更寬的網。
我猜你的邏輯實在是更像是:
x = a.some_method
x = [ ] if(x.nil?)
所以你真正想要做的是把nil
爲空數組並獨自離開的數組。 Array#to_a
和NilClass#to_a
到正是這樣,你可以簡單地說:
x = a.some_method.to_a
的問題Array#to_a
是,它不處理Array
子那麼好,但是這是一個非常罕見的問題。
在某些情況下「不存在」的意思nil
,在別人就意味着0
,''
,[ ]
,......所以我們有便捷to_X
和presence
方法方便地躲在方法調用的差異。
你已經有了一些很好的答案。另一種方法 - 如果這是您自己的代碼中的問題 - 則可以在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
我個人認爲這是明確的安全包裝一個更好的替代方案,在這個線程別處建議。
據我所知,a.some_method
返回一個數組或nil
,並且如果nil
您希望它返回一個空數組。如果這是正確的,你可以寫:
a.some_method.to_a
如果a.some_method
返回數組arr
,arr.to_a #=> arr
。 (見Array#to_a。)
如果a.some_method
返回nil
,nil.to_a #=> []
。 (請參閱NilClass#to_a)。
'a = a.some_method || []' – Hamms