1

所以我在我的数组上推送一些元素,如下所示:

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 案例?

一种可能的解决方案是,当有一个 nil 值时,只需将字符串推none送到数组中......但这会是什么样子?

谢谢。

编辑1:

这是我得到的错误:

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

6 回答 6

2

您应该替换j.children[0].text.strip!为以下两件事之一:

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

或者

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

当然,当文本为 nil 时,这些会产生不同的效果。我认为您的实际问题是strip!返回 nil,从错误消息中您应该很明显。

于 2012-05-26T08:00:45.753 回答
2

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

如果您更改strip!strip

在更一般的意义上,您可以创建一个对象来为您返回数组。你不想去改变(我假设是)Nokogiri,但你可以把它包裹在一些东西中以隐藏导致的火车残骸

于 2012-05-26T16:53:31.407 回答
1

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

于 2012-05-26T07:58:42.243 回答
0

nil or a_string将会a_string

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

于 2012-05-26T07:50:26.277 回答
0

如果你在 Rails 中,这是 try 方法的一个很好的用途。

似乎您的 strip 和 gsub 也是多余的。请考虑这个实现:

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 ]
于 2012-05-26T08:06:29.100 回答
0

如果您在 rails 环境中,您可以尝试try方法:https ://github.com/rails/rails/blob/82d41c969897cca28bb318f7caf301d520a2fbf3/activesupport/lib/active_support/core_ext/object/try.rb#L50

于 2012-05-26T08:23:24.303 回答