Почему Ruby 1.9.2 выдает синтаксическую ошибку для: put (true и false)? - PullRequest
5 голосов
/ 08 марта 2012

Я озадачен тем, что Ruby 1.9 (JRuby 1.6.6 (RUBY_VERSION == "1.9.2") и Ruby 1.9.3-p125) выдает синтаксическую ошибку для puts(true and false).

Не знаюне знаю почему - в чем здесь проблема?Как бы я правильно написал этот кусок кода?puts(true && false) работает, но есть ли решение с and?

Пример сеанса irb:

1.9.3p125 :001 > puts(true and false)
SyntaxError: (irb):1: syntax error, unexpected keyword_and, expecting ')'
puts(true and false)
             ^
    from /home/fr/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `<main>'
1.9.3p125 :002 > puts(true && false)
false
 => nil 

Спасибо Младену Яблановичу за упрощение примера.Старый пример был f(true and f(false)).

Ответы [ 2 ]

3 голосов
/ 08 марта 2012

Все дело в приоритетах "и" и "&&" не имеют одинаковых приоритетов для операндов, попробуйте использовать

f((true and f(false)))

'и' следует использовать для чего-то вроде "делай вещи А, если это работает нормально, то делай вещи Б", а не для строгой логической проверки.

check_db(param) and connect_db(param)
1 голос
/ 08 марта 2012

Приоритет оператора в 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:)

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