Ошибка вы получаете является результатом того, как рубин интерпретирует код. Ваш код состоит из определения класса с включенным корпусом класса (между class
и окончательным end
).
Тело класса выполняется один раз, когда интерпретатор Ruby загружает файл. Когда интерпретатор обрабатывает тело, выполняются различные утверждения. Когда встречается запрос на delayTime
, этот метод еще не определен.
У вас есть несколько способов справиться с этим. Во-первых, вы можете не захотеть, чтобы код в кубе класса выполнялся во время загрузки, но вместо этого вы вызываете метод класса (сам экземпляр или класс).
Это может быть достигнуто путем переноса вашей логики внутри метода, например.
class Main
def execute
...
delayTime
...
end
def delayTime
...
end
end
Main.new.execute # Instantiate the class and execute the wanted method
Однако, если вы действительно хотите, чтобы выполнить код во время загрузки, и до сих пор называют определенный метод, вам нужно сделать несколько изменений. Прежде всего вам нужно определить метод до того, как выполняется код вызова (во время загрузки, помните). Помимо определения его перед вызывающим кодом, вам нужно убедиться, что вы определяете его как метод класса (либо путем префикса метода с помощью self.
, либо путем определения определения класса с помощью синтаксиса class << self ... end
и определения метода там). Это необходимо, так как экземпляр класса не известен как тело класса. Состояние курицы и яиц.
Модифицированная версия будет выглядеть примерно так:
class Main
def self.delayTime
...
end
...
self.delayTime # Could also be called as Main.delayTime
....
end
И, наконец, пример, открыв определение класса:
class Main
class << self
def delayTime
...
end
end
...
self.delayTime # Could also be called as Main.delayTime
....
end
Заметим, однако, что, помещая логику самого тела класса, вы можете столкнуться с некоторыми нежелательными проблемами, так как ваша программа выходит за рамки одного файла, и вы начинаете включать (require
/load
) несколько файлов. Но, это история на другой день.
Полный контекст отсутствует. Этот код должен работать, поэтому моя гипотеза заключается в том, что контекст вызова отличается от контекста определения. – user2246674
Что вы думаете? – sawa
Мой вопрос в том, почему это ошибка. В программе почти ничего нет, всего несколько выражений 'puts' и if. Я не понимаю, почему он не работает. Полный код, особенно не мой, я просто делаю его более эффективным или что-то в этом роде, здесь: http://pastebin.com/JehGB7fK – IHazABone