如何避免短路评估

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

if (model1.valid? && model2.valid?) ... end 

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

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

试试这个:

 ([model1, model2].map(&:valid?)).all? 

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

工作得很好。

 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 

怎么样:

 if [model1.valid?,model2.valid?].all? ... end 

适合我。

单独评估它们并将结果存储在变量中。 然后在那些布尔值之间使用简单的&& 🙂

您可以将块传递给all? ,而不是使用地图创建额外的数组all?

 [model_instance_1, model_instance_2].all? {|i| i.valid? }