Почему символ не равен символу - PullRequest
0 голосов
/ 14 февраля 2019

Я сделал:

x = :foo, y = %q{foo}.to_sym, x.==(y)
# => [:foo, :foo, false] 

Мне интересно, почему :foo не равно :foo.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Хороший ответ, но есть логический переход от «x еще не определен» к «последнему члену, эффективно сравнивающему nil и: foo.», В частности, почему неопределенная переменная оценивается как nilнеобъяснимо.

Это связано с тем, как в Ruby реализовано перемещение переменных.Это неприятная особенность JavaScript тоже.

0 голосов
/ 14 февраля 2019

Параллельное присваивание работает по-разному в 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.Переводчик знает, что вы имеете в виду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...