Как обрабатываются условия? - PullRequest
0 голосов
/ 03 января 2012

Если результат равен нулю, тогда я получаю 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

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Я бы подумал изменить его на что-то, что 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
1 голос
/ 03 января 2012

В ruby ​​оператор not имеет более низкий приоритет , чем &&, поэтому ваш код интерпретируется как

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

Возможно, вы хотите использовать!вместо этого оператор, который делает то же самое, что и not, но имеет более высокий приоритет.

...