Как избежать оценки короткого замыкания на - PullRequest
28 голосов
/ 28 января 2009

Я работаю с Ruby on Rails и хотел бы проверить две разные модели:

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

Однако оператор «&&» использует оценку короткого замыкания (т. Е. Он оценивает «model2.valid?» Только в том случае, если «model1.valid?» Имеет значение «истина»), что предотвращает выполнение model2.valids, если model1 недопустима.

Есть ли эквивалент "&&", который не использовал бы оценку короткого замыкания? Мне нужно вычислить два выражения.

Ответы [ 5 ]

25 голосов
/ 28 января 2009

Попробуйте это:

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

Он вернет true, если оба действительны, и создаст ошибки в обоих случаях.

23 голосов
/ 28 января 2009

и отлично работает.

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
3 голосов
/ 03 июня 2010

Как насчет:

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

У меня работает.

2 голосов
/ 28 января 2009

Оцените их отдельно и сохраните результат в переменной. Затем используйте простой && между этими логическими значениями:)

0 голосов
/ 28 января 2009

Вместо создания дополнительного массива с картой, вы можете передать блок в all?.

[model_instance_1, model_instance_2].all? {|i| i.valid? }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...