Вопрос по ruby – Ruby, если против конца строки, если ведут себя иначе?

15

Почему этот код не работает?

b if b = true

Ошибка:undefined local variable or method `b'

Но это делает:

if b = true
    b
end

Разве они не должны быть одинаковыми?

Это может быть даже упрощено:k if k = 1 а такжеif k = 1; k; end Flexoid
Что касается практики кодирования, я предпочитаю не видеть назначения в условии. Это усложняет обслуживание кода, поскольку трудно сказать, было ли предназначение назначено или произошла опечатка, и это должен был быть тест на равенство (==). Тот факт, что он работает не так, как вы ожидаете, будет просто поводом пометить его в обзоре кода. the Tin Man
Условные выражения - это выражения, как и все остальное в Ruby, поэтому такое поведение ожидается, когда анализатор пытается назначить переменные, и его будет трудно изменить. Я согласен, хотя, что это совершенно не интуитивно понятно и не следует принципу наименьшего удивления. Michael Papile
Это было мое небольшое раздражение; Я не думаю, что есть какая-либо серьезная причина, по которой ваш код не может работать, поэтому, возможно, они добавят эту функцию в следующую версию ruby. David Grayson

Ваш Ответ

5   ответов
2

k ударил парсер, потому что его еще не видели.

Во второй версииk является частью выражения присваивания и анализируется по-разному.

2

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

Если вы напишите это так, ошибки не будет и она работает так, как вы ожидали:

k = nil
h = {k: 1}
v = k if k = h.delete(:k)
15

в Ruby.

Вотсообщение от Matz на трекере ошибок Ruby об этом:

local variable scope determined up to down, left to right. So a local variable first assigned in the condition of if modifier is not effective in the left side if body. It's a spec.

+1 отличная ссылка
+1 за ссылку.
Спасибо за причину.
0

Попробуйте с & apos; == & apos;

Тогда вы получите ошибку

Во втором примере вы назначаете «верно» б.

0

Because the Ruby interpreter creates a local variable when it sees an assignment

Во втором случае он еще не видел присваивания, поэтому переменная не существует, когда выражение анализируется.

Чтобы быть более точным, метод сначала анализируется во внутреннем представлении, а затем, возможно, код в конечном итоге будет вызван и фактически выполнен.

Локальные переменныеcreated в этом разборе Это вопрос декларации, это просто означает, что переводчик узнает о них. Они не будут созданы в том смысле, что им дано пространство или значение, пока кто-то не вызовет окружающий метод.

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