Приоритет оператора присваивания и условные операторы - PullRequest
1 голос
/ 15 декабря 2010

Я читаю книгу под названием "Язык программирования Ruby" для Ruby 1.8 и 1.9. В книге говорится, что оператор if имеет более низкий приоритет, чем оператор присваивания. Если это правда, тогда я не понимаю, как работают эти выражения:

x = 5 if false

Если оператор присваивания имеет более высокий приоритет, то он должен выполняться перед оператором if. Таким образом, 5 должно быть присвоено x до выполнения if false.

Я неправильно понимаю приоритет?

Ответы [ 2 ]

1 голос
/ 15 декабря 2010

Более высокий приоритет присваивания означает, что ваше выражение оценивается как (x = 5) if false, а не x = (5 if false).Обратите внимание, что позже это также совершенно правильное выражение.

Выполнено ли каждое конкретное предложение, определяется правилами языка.Например, в троичном операторе a ? b : c будут выполняться только b или c, но не оба.

edit
О разнице

В x = (5 if false) назначение обрабатывается первым.Но для его завершения нам понадобится левая часть присваивания, которая равна nil, потому что 5 if false оценивается как nil.Итак, выражение эквивалентно x = nil.

В (x = 5) if false условный оператор обрабатывается первым.Согласно его правилам, мы должны сначала оценить состояние (false).Поскольку это false, больше ничего не нужно делать, а результат оценки - nil.

Надеюсь, это понятно.

0 голосов
/ 15 декабря 2010

Потому что <expr> if <condition> - это не одно выражение. Это особый синтаксический сахар Рубина. Это работает так же, как:

if <condition>
    <expr>
end

где, очевидно, <expr> должен оцениваться только после <condition>, поскольку <condition> может быть false.

...