所以我在这个数组上推送一些元素:
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
答案 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)
答案 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)