Ruby: Как вызвать функцию до ее определения?
В моем файле seeds.rb
я хотел бы иметь следующую структуру:
# begin of variables initialization
groups = ...
# end of variables initialization
check_data
save_data_in_database
# functions go here
def check_data
...
end
def save_data_in_database
...
end
Однако, я получил ошибку, потому что я вызываю check_data
, прежде чем он будет определен. Ну, я могу положить определение в верхней части файла, но тогда файл будет менее читабельным для моего мнения. Есть ли другой способ обхода?
Ответы
Ответ 1
В Ruby определения функций - это операторы, которые выполняются точно так же, как и другие операторы, такие как присвоение и т.д. Это означает, что до тех пор, пока интерпретатор не ударит по вашему запросу "def check_data", check_data не существует. Поэтому функции должны быть определены до их использования.
Один из способов заключается в том, чтобы поместить функции в отдельный файл "data_functions.rb" и потребовать его вверху:
require 'data_functions'
Если вы действительно хотите их в одном файле, вы можете взять всю свою основную логику и обернуть ее в свою собственную функцию, а затем вызвать ее в конце:
def main
groups = ...
check_data
save_data_in_database
end
def check_data
...
end
def save_data_in_database
...
end
main # run main code
Но обратите внимание, что Ruby объектно ориентирован, и в какой-то момент вы, вероятно, в конечном итоге завершите свою логику в объекты, вместо того, чтобы просто писать одинокие функции.
Ответ 2
Вы можете использовать END
(верхний регистр, а не нижний регистр)
END {
# begin of variables initialization
groups = ...
# end of variables initialization
check_data
save_data_in_database
}
но это будет немного взломать.
В принципе, код END
запускается после запуска всего другого кода.
Изменить: Там также Kernel#at_exit
, (ссылка rdoc)
Ответ 3
Эндрю Гримм упоминает КОНЕЦ; там также НАЧАЛО
foo "hello"
BEGIN {
def foo (n)
puts n
end}
Вы не можете использовать это для инициализации переменных, потому что {} определяет область локальной переменной.
Ответ 4
Вы можете поместить функции в другой файл и сделать запрос в верхней части script.
Ответ 5
Оберните свои начальные вызовы в функцию и вызовите эту функцию в конце:
# begin of variables initialization
groups = ...
# end of variables initialization
def to_be_run_later
check_data
save_data_in_database
end
# functions go here
def check_data
...
end
def save_data_in_database
...
end
to_be_run_later