Почему условный оператор и присвоение оценивают в рубиновых сбоях, если, “если” оператор в конце пункта?

Вы рассмотрели lsof (список открытые файлы)?

5
задан Felix 8 October 2014 в 07:42
поделиться

2 ответа

Это не удается из-за того, как работает синтаксический анализатор.

С точки зрения синтаксического анализатора переменная tmp2 существует с точки в коде, в которой она впервые назначается, до точки, в которой она выходит за рамки. Для этого не имеет значения, когда (или если) присваивание действительно выполняется, как раз тогда, когда синтаксический анализатор видит присваивание (т. Е. Это зависит от позиции присваивания в коде).

Редактировать: Чтобы расширить этот бит:

Решение, является ли имя локальной переменной или вызовом метода, принимает синтаксический анализатор. Синтаксический анализатор принимает это решение исключительно на основании того, видел ли он уже присвоение этой переменной. Поэтому, когда парсер видит tmp2 перед тем, как увидеть tmp2 = ... , он решает, что здесь tmp2 относится к методу. Когда эта часть кода действительно выполняется,

8
ответ дан 14 December 2019 в 04:43
поделиться

Оператор присваивания создает переменную. Таким образом, когда он видит puts.temp2.to_s он еще не знает, что такое tmp2. Если вы измените код на:

def foo;5;end
tmp2=1
puts tmp2.to_s if (tmp2 = foo)

Он будет работать (и выведет «5»)

0
ответ дан 14 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: