繁体   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