如何避免短路评估

29 ruby-on-rails operators short-circuiting logical-operators

我正在使用Ruby on Rails,并希望验证两种不同的模型:

if (model1.valid? && model2.valid?)
...
end
Run Code Online (Sandbox Code Playgroud)

但是,"&&"运算符使用短路评估(即仅当"model1.valid?"为真时才评估"model2.valid?"),这会阻止在model1无效时执行model2.valids.

是否存在不会使用短路评估的等效"&&"?我需要评估两个表达式.

Cod*_*eef 26

试试这个:

([model1, model2].map(&:valid?)).all?
Run Code Online (Sandbox Code Playgroud)

如果两者都有效,它将返回true,并在两个实例上创建错误.

  • 注意`地图(:有效吗?)`一步很重要:`[模型1,模型2].所有(:有效吗?)?'是一个短路操作(它不会在'model2`如果收集错误`model1`上有错误.) (3认同)

Pau*_*ith 24

工作得很好.

irb(main):007:0> def a
irb(main):008:1> puts "a"
irb(main):009:1> false
irb(main):010:1> end
=> nil

irb(main):011:0> def b
irb(main):012:1> puts "b"
irb(main):013:1> true
irb(main):014:1> end
=> nil

irb(main):015:0> a && b
a
=> false

irb(main):016:0> a & b
a
b
=> false

irb(main):017:0> a and b
a
=> false
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您必须注意&|的左侧 或^运算符,因为它们只是在TrueClass和FalseClass上定义的方法,AFAICT ...... (3认同)