Ruby: Как вызвать функцию до ее определения? - PullRequest
11 голосов
/ 21 апреля 2011

В моем файле 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, прежде чем она будет определена.Ну, я могу поместить определение в верхнюю часть файла, но тогда этот файл будет менее читабельным, по моему мнению.Есть ли другой обходной путь?

Ответы [ 5 ]

23 голосов
/ 21 апреля 2011

В 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 является объектно-ориентированным, и в какой-то момент вы, вероятно, в конечном итоге будете оборачивать свою логику в объекты, а не просто писать одинокие функции.

10 голосов
/ 21 апреля 2011

Эндрю Гримм упоминает КОНЕЦ;есть также BEGIN

foo "hello"


BEGIN {
def foo (n)
  puts n
end}

Вы не можете использовать это для инициализации переменных, потому что {} определяет область видимости локальной переменной.

9 голосов
/ 21 апреля 2011

Вы могли бы использовать END (верхний регистр, не нижний регистр)

END {
  # begin of variables initialization
  groups = ...
  # end of variables initialization
  check_data
  save_data_in_database
}

, но это было бы немного взломать.запускается после запуска всего остального кода.

Редактировать: Также есть Kernel#at_exit, ( ссылка rdoc )

3 голосов
/ 21 апреля 2011

Вы можете поместить функции в другой файл и сделать запрос в верхней части скрипта.

1 голос
/ 21 апреля 2011

Оберните ваши начальные вызовы в функцию и вызовите эту функцию в конце:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...