2014-02-06 3 views
0

Я попробовал подобный код в Ruby:Старшинство операторов в рубин

if object && object.is? ball 
    object.throw! 
end 

Это привело к синтаксической ошибке:

unexpected tIDENTIFIER, expecting keyword_then or ';' or '\n' 

Я полагаю, это потому, что & & должен иметь более высокий «приоритет ", чем вызов функции (извините, я не знаю правильную терминологию), и поэтому Ruby по сути увидел инструкцию как:

if (object && object.is?) ball 
    object.throw! 
end 

, который не имеет смысла и поэтому синтаксическая ошибка в порядке.

Это дополнительно подтверждается тем фактом, что это работа:

if object and object.is? ball 
    object.throw! 
end 

Я полагаю, это потому, что «и» имеет более низкий приоритет, чем & &, так что «приоритет» вызова функции должно быть где-то между & & и 'и'.

Однако в таблицах порядка приоритета, которые я видел ранее, вызовы функций не указаны.

Я хотел бы получить некоторое представление о том, что здесь происходит, и, возможно, некоторые ссылки на спецификацию ruby. Я не эксперт в резолюции выражения, я просто интересно узнать больше о процессах, задачах и теория позади этого примера, без сомнения, более широкой теме

+0

* [Предшествование встроенный в Ruby, можно переопределить] (Http: //www.techotopia. com/index.php/Ruby_Operator_Precedence), окружая секцию нижнего приоритета выражения с помощью круглых скобок * так, 'object && object.is? ball' может быть как 'object && (object.is? ball)'. –

ответ

0

Из-за выполнения операторов, вы должны либо сделать:

if object && (object.is? ball) 

или

if object && object.is?(ball) 

причина в том, "& &" и "||" имеют более высокий приоритет, чем «и» и «или». Таким образом, если вы не используете скобки для последнего «object.is? Ball», «object.is?» сначала будут схвачены «& &». Однако, если вы используете «и» без скобок, он отлично работает, так как она имеет самый низкий приоритет в этом случае:

if object and object.is? ball 
Смежные вопросы