Условные выражения и циклы не имеют своей области видимости в Ruby; и здесь у вас есть переменная и метод self
, которые имеют одно и то же имя. В состоянии if
используется метод current_step
, но в его теле определяется локальная переменная, и все будущие ссылки на current_step
будут ссылаться на локальную переменную. Подводный камень, с которым вы столкнулись, даже если тело if
не выполнено, локальная переменная все еще определена, и ей присвоено значение по умолчанию nil
.
Я поясню это, добавив _M
к идентификатору при обращении к методу и _L
для локальной переменной.
def next_step
logger.debug "Now at step: " + current_step_M.inspect
if (current_step_M == nil)
current_step_L = 0
### this part is implicit:
# else
# current_step_L = nil
end
current_step_L = current_step_L + 1
end
Полагаю, вы на самом деле пытались выполнить self.current_step = 0
, что вызвало бы сеттер.