如何处理条件?

时间:2012-01-02 23:42:42

标签: ruby conditional-statements operator-precedence

如果结果为零,那么我得到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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

在ruby中,not运算符的precedence低于&&,因此您的代码被解释为

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

你可能想要使用!运算符,而不是not,但具有更高的优先级。