2014-02-12 1 views
2

У меня есть вопрос о том, как интерпретатор Рубин присваивает переменные:рубин присвоение переменной в условном «если» модификатор

Я использую это довольно часто:

return foo if (foo = bar.some_method) 

где some_method возвращает объект или ноль.

Однако, когда я пытаюсь это:

return foo if (true && (foo = bar.some_method)) 

я получаю: NameError определено локальная переменная или метод Foo для главного: Object.

В чем разница в оценке между первой и второй строками, которая вызывает ошибку второй линии?

+2

Потому что назначение будет короткозамкнутым во втором варианте. Но я не уверен, что это образец, который поддается чтению. –

ответ

7

Read it carefully:

Другой часто путая случай при использовании модификатора, если:

p a if a = 0.zero? 

Вместо печати true вы получите NameError, «неопределенные локальная переменная или метод 'а'». С Ruby анализирует голые a слева от if первым и еще не видел присвоение. Предполагается, что вы хотите назвать метод. Затем Ruby видит назначение на a и предположим, что вы ссылаетесь на local method.

Путаница происходит из испорченного исполнения выражения в. Сначала назначается локальная переменная, затем вы пытаетесь вызвать несуществующий метод.

Как вы сказали - Ни return foo if (foo = bar.some_method) и return foo if (true && (foo = bar.some_method)) не будет работать, я пари, он не будет работать, если вы не определили foo до этой линии.

+2

Черт, я думал, что удалил этот вопрос! Я понял вскоре после того, как я опубликовал, что я уже определил foo в irb, когда я проверил это. Я оставлю это свидетельство своей неохоты, чтобы другие узнали. Спасибо за ответ. – jz999