2012-01-02 62 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