Параллельное присваивание работает по-разному в Ruby, и если вы хотите, чтобы в одной строке было несколько операторов, вам нужно разделить их точками с запятой (не запятыми).
Вы выполнили оператор:
x = :foo, y = %q{foo}.to_sym, x == y
Эквивалентно:
x = [:foo, y = %q{foo}.to_sym, x == y]
NB x
еще не определено, когда правая часть выраженияоценивается, поэтому последний член эффективно сравнивает nil
и :foo
.Присвоение y
также происходит во время вычисления правой части выражения, и результат включается в литерал массива, присваиваемый x
.
Вот что вы хотели сделать:
x, y = :foo, %q{foo}.to_sym; x == y # => true
Просто в стороне, x.==(y)
работает, потому что :==
технически метод, но в идиоматическом Ruby вы просто пишете x == y
.Переводчик знает, что вы имеете в виду.