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