如何在我的数组赋值中优雅地处理nil个案 - Ruby?

时间:2012-05-26 07:46:59

标签: ruby

所以我在这个数组上推送一些元素:

upd_city_list << [ j.children[0].text.strip!.gsub(/\s+\W/, ''), j.children[1].text, j.children[1][:href] ]

以上是迭代器(因此使用j)。

问题在于,j.children[0].text不时会出现nil,Ruby也不喜欢这样。

我可以在这个作业之前添加一堆if语句,但这对我来说似乎有些不雅。

如何以优雅的方式处理这种情况下的零病例?

一个可能的解决方案是,当存在nil值时,只需将字符串none推送到数组上....但是看起来会是什么样?

感谢。

EDIT1:

这是我得到的错误:

NoMethodError: private method ‘gsub’ called for nil:NilClass

6 个答案:

答案 0 :(得分:2)

您应该使用以下两种方法之一替换j.children[0].text.strip!

(j.children[0].text || 'none').strip

j.children[0].text.to_s.strip

当文本为零时,这些将具有不同的效果。我认为你的实际问题是strip!返回nil,这对你来说应该是错误信息。

答案 1 :(得分:2)

真正的问题是,当字符串没有变化时strip!返回nil。您的text方法 返回一个字符串,您的strip!方法返回nil。我不知道为什么会这样。我也不喜欢它。

如果您只是将strip!更改为strip

,此问题就会消失

从更一般的意义上讲,您可以创建一个对象来为您返回数组。你不想改变(我认为是)Nokogiri,但是你可以把它包装成隐藏train wrecks结果的东西。

答案 2 :(得分:1)

这可能是一个使用空对象编程模式的情况。 Nil不是一个好的空对象。请尝试阅读herehere。空对象是优雅的方式。

答案 3 :(得分:0)

nil or a_string将为a_string

那么(j.children[0].text or 'none')

答案 4 :(得分:0)

如果您使用rails,这对try方法非常有用。

似乎你的条带和gsub是redundent。请考虑这个实现:

descriptive_name_1 = j.children[0].text.try(:strip)
descriptive_name_2 = j.children[1].text
descriptive_name_3 = j.children[1][:href]
updated_city_list << [ descriptive_name_1 , descriptive_name_2, descriptive_name_3 ]

不用尝试

descriptive_name_1 = j.children[0].text.to_s.strip 
descriptive_name_2 = j.children[1].text
descriptive_name_3 = j.children[1][:href]
updated_city_list << [ descriptive_name_1 , descriptive_name_2, descriptive_name_3 ]

答案 5 :(得分:0)