[英]Rails 3.1: Ruby idiom to prevent .each from throwing exception if nil?
有沒有辦法使用.each
因此如果 object 為 nil 或為空(不添加額外的 nil/空白測試?
似乎如果我說phonelist.each do |phone|
如果 phonelist 為空,則不應執行該塊。
但在我看來(haml)我有- @myvar.phonelist.each do |phone|
如果電話列表為空,它會拋出一個 NoMethodError。
我經常遇到這個問題,並且總是通過添加一個明確的檢查/分支 for.blank 來解決這個問題? 但似乎應該有一個更簡單的方法來告訴。每個空意味着什么都不做。
您可以使用try方法在 nil 上調用 .each ,因此如果對象為 nil 或為空,它不會拋出錯誤。
phonelist = nil
phonelist.try(:each){|i| puts i}
只需執行以下操作:
Array(phonelist).each do |phone|
#deal with your phone
end
如果 my_variable 為零,則 Array(my_variable) 將確保返回一個數組。
如果 my_variable 已經是一個數組,它不會創建一個新的數組,所以在任何你想要的地方使用它都是安全和輕松的!
您正試圖在更大的問題上使用創可貼。
Ruby 有一個 nil 的概念; 無法繞過它。 如果您在nil
上調用一個方法,那么您假設它是有效的,即您的設計假設它是有效的。 所以真正的問題是:你的設計中的漏洞在哪里? 為什么你的假設不正確?
這里的問題不是你不能在不支持它的對象上調用任意方法; 問題是您的數據被認為是有效的,而顯然情況並非總是如此。
但在我看來(haml)我有 - @myvar.phonelist.each do |phone| 如果 phonelist 為空,則拋出 NoMethodError。
否。如果phonelist
不是實現.each
的對象, .each
引發錯誤。 非常不一樣。
如果為空,您始終可以將其初始化為空數組,即phonelist ||= []
,但我更喜歡一種設計,以確保盡可能確保有效數據。
不敢相信還沒有人提出這個建議:
(@myvar.phonelist || []).each do |phone|
...
如果phonelist
為nil
, each
將在空數組上循環,執行塊零次。
但是,如果phonelist
不是可枚舉的(例如數組),這仍然會引發異常。
如果您從散列(例如解析的 JSON 文件)中獲取phonelist
列表,您可能希望使用帶有[]
作為默認值的fetch
。
phonelist = my_data.fetch('phonelist', [])
只需確保空phonelist
是[]
,而不是nil
值。
或者,一個nil
值在 Ruby 中是假的,所以你可以使用nil-punning
if phonelist
phonelist.each do |phone|
...
我經常看到的是:
@myvar.phonelist.each do |phone|
# ...
end unless @myvar.phonelist.nil?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.