簡體   English   中英

Rails 3.1:Ruby 成語防止.each 如果為零則拋出異常?

[英]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|
   ...

如果phonelistnileach將在空數組上循環,執行塊零次。

但是,如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM