Приоритет оператора в ruby равен &&
перед =
перед and
. Так что в вашем примере, использующем and
, он попытается сделать это (неявное) назначение:
puts(true
, а затем объединить его с
false)
через and
, что вызывает синтаксическую ошибку. Смотрите отличное объяснение здесь: Разница между "и" и && в Ruby?
РЕДАКТИРОВАТЬ: Я не уверен, имеет ли смысл мое «неявное назначение» - подумайте об этом утверждении, чтобы сделать его явным:
foo = puts(true and false)
EDIT 2: Помните, что вызов метода действительно вызывается для объекта. Таким образом, эквивалентные утверждения для двух случаев были бы:
Object.send("puts", true && false) # this works
Object.send("puts", true and false) # this is a syntax error
Object.send("puts", (true and false)) # works again
Не уверен, поможет ли это больше - вы правы, это немного нелогично. Мое решение - держаться подальше от and
:)