Я думаю, в конце концов, это действительно просто оценка короткого замыкания, как Рэй упоминает в своем ответе, но я думаю, что в этом отношении документации не хватает.
||
- оператор короткого замыканиятак как оценка продолжается слева направо, как только она находит истину, она завершается и возвращает истину, в противном случае она переходит вправо
на modifier-if
(также указано на странице, на которую вы ссылались)) имеет более низкий приоритет, чем присвоение =
, однако присвоение не является оператором короткого замыкания, поэтому код типа
foo = "not set"
is_true = false
foo = 42 if is_true
puts foo
будет печатать
не установлено
в то время как код, такой как:
foo = "not set"
is_true = true
foo = 42 if is_true
puts foo
будет печатать
42
||
является оператором короткого замыкания, поэтому такой код:
foo = 0
foo || foo = 42
puts foo
напечатает
0
, поскольку foo для левой руки не равен нулю, поэтому нет смысла оценивать правую часть.
в то время как код такой:
foo = nil
foo || foo = 42
puts foo
напечатает
42
, поскольку foo равно нулю, оценка будет продолжаться в правой части ||
доэто что-то, что является истинным или возвращает последнее выражение, которое будет истинным или ложным.
Я согласен, однако, что документ, на который вы указываете, подразумевал бы, что
x || y = z
должен быть основан наприоритет может быть истолкован как (x || y) = z
, что не будет законным.Однако также очевидно, что это было бы то же самое, что и попытка присвоить значение логическому значению.
Например:
(true || true) = 42
- синтаксическая ошибка
, как и:
a = nil
b = nil
(a || b) = 42
пока
a = nil
b = nil
a || b = 42
puts b
приводит к
42