2012-01-02 58 views
0

如果结果为零,那么我得到NoMethodError - undefined method 'length' for nil:NilClass:条件如何处理?

有什么办法我不必使用两个条件?我认为,如果结果为空,ruby将不会评估条件的第二部分,因为条件可能永远不会成立。

if (not results.empty? && results[-1].length == 2) 
    (4-results[-1].length).times {|i| results[-1] << ""} 
end 

回答

1

在红宝石not运营商具有较低​​比&&因此您的代码被解释为

not (results.empty? && (results[-1].length == 2)) 

你可能想使用!运算符代替,它与not相同,但具有更高的优先级。

+0

你的情况和我是不一样的... – Radek 2012-01-03 00:07:37

+0

用'!'代替'not'解决了这个问题。谢谢。你想修复你的答案,以便我可以接受它吗? – Radek 2012-01-03 00:09:11

+1

除非我错过了一些东西,它们故意不同 - 我添加了一些parens来显示ruby如何解释你的代码,这与你的意图是不同的 – 2012-01-03 00:14:40

2

我会考虑它改变的东西,IMO“读取”更好:

if results.any? && (results[-1].length == 2) 
    ... 
end 

以避免出现两个明确的条件下,安装andand gem

pry(main)> require 'andand' 
pry(main)> r1 = [] 
pry(main)> r2 = ["hi", "there"] 
pry(main)> r3 = ["hi", "no"] 
pry(main)> puts "foo" if r1[-1].andand.length == 2 
=> nil 
pry(main)> puts "foo" if r2[-1].andand.length == 2 
=> nil 
pry(main)> puts "foo" if r3[-1].andand.length == 2 
foo 
=> nil 
+0

感谢您的andand链接。只有当长度为== 2时,才会将空字符串添加到最后一个元素。我预计长度为4,但是我从csv文件读取值,因此今天发生的长度与预期不符。该文件包含所有结果,并且每个字段都有由|分隔的子字段,它发生了|失踪。所以我在分割('|')之后添加新的空元素以使排序变得快乐。在拆分之后在其中一个字段上排序不起作用,因为元素为零。添加这些空元素解决了它。 – Radek 2012-01-03 01:05:00

+0

我在http://ruby-doc.org/core-1.9.3/Array.html – Radek 2012-01-03 01:07:29

+1

中看不到'任何?'方法。因为它不在'Array'上,而是[Enumerable](http:// ruby -doc.org/core-1.9.3/Enumerable.html#method-i-any-3F)。最好搜索方法名称而不是类,因为很容易猜错。 – 2012-01-03 01:16:33