Во-первых, приоритет здесь не проблема, потому что foo = bar || (*zap)
работает не лучше. Основное правило заключается в том, что вы не можете выполнять дополнительные операции с восклицательным знаком. Даже что-то простое, например foo = (*zap)
, недопустимо. Это относится и к 1.9.
Сказав это, что вы ожидаете от foo = bar || *zap
, если оно сработает, отличается от foo = bar || zap
? Даже в случае, подобном a, b = bar || *zap
(который также не работает), a, b = bar || zap
выполняет то, что я предполагаю, было бы тем же самым.
Единственная ситуация, в которой это может иметь какой-то смысл, это что-то вроде a, b = foo, bar || *zap
. Вы должны обнаружить, что большинство случаев, когда вы хотели бы использовать это, покрыто a, b = foo, *(bar || zap)
. Если это не касается вашего случая, вам, вероятно, следует спросить себя, чего вы действительно надеетесь достичь, написав такую уродливую конструкцию.
EDIT:
В ответ на ваши комментарии *zap || bar
эквивалентно *(zap || bar)
. Это показывает, насколько низок приоритет сплата. Точно, как низко это? Лучший ответ, который я могу вам дать - «довольно низкий».
Для интересного примера рассмотрим метод foo
, который принимает три аргумента:
def foo(a, b, c)
#important stuff happens here!
end
foo(*bar = [1, 2, 3])
появится после присваивания и установит аргументы в 1, 2 и 3 соответственно. Сравните это с foo((*bar = [1, 2, 3]))
, который будет жаловаться на неправильное количество аргументов (1 для 3).