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