Rails 3.1:Ruby成语,以防止.each抛出exception,如果为nil?
有没有办法使用.each
所以如果对象为零或空(如果没有添加额外的空/空白测试,它不会抛出错误?
似乎如果我说phonelist.each do |phone|
如果phonelist为空,则不应执行该块。
但在我看来(haml)我有- @myvar.phonelist.each do |phone|
如果phonelist为空,则抛出NoMethodError。
我遇到了很多,总是通过为.blank添加显式检查/分支来解决这个问题? 但似乎应该有一种更简单的方法来告诉。每个空手段什么都不做。
你试图在一个更大的问题上打造一个创可贴。
Ruby有一个nil的概念; 不能绕过它。 如果你在nil
上调用方法,那么你假设它是有效的,即你的设计认为它是有效的。 所以问题是:你设计中的洞在哪里? 为什么你的假设不正确?
这里的问题不是你不能在不支持它的对象上调用任意方法; 问题是,当显然并非总是如此时,假设您的数据是有效的。
但在我看来(haml)我有 – @ myvar.phonelist.each做|电话| 如果phonelist为空,则抛出NoMethodError。
不。如果phonelist
不是实现.each
的对象,则抛出错误。 非常不一样。
如果为null,你总是可以将它初始化为一个空数组,即phonelist ||= []
,但我更喜欢一种只要有可能就能确保有效数据的设计。
你可以使用try方法在一个nil上调用.each,这样如果对象为nil或为空,它就不会抛出错误。
phonelist = nil phonelist.try(:each){|i| puts i}
只需执行以下操作:
Array(phonelist).each do |phone| #deal with your phone end
如果my_variable为nil,Array(my_variable)将确保返回一个数组。
如果my_variable已经是一个数组,它不会创建一个新数组,所以在任何你想要的地方使用它都是安全和轻松的!
如果你从散列中获取了phonelist
(例如解析的JSON文件),你可能希望使用fetch
作为默认值。
phonelist = my_data.fetch('phonelist', [])
只需确保空的phonelist
是[]
,而不是nil
值。
或者,Ruby中的nil
值为false,因此您可以使用nil-punning
if phonelist phonelist.each do |phone| ...