如何在Ruby中定义一个函数之前调用它?



在我的seeds.rb文件中,我希望有以下结构:

# Start 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之前,它被定义。嗯,我可以把定义放在文件的顶部,但我认为这样文件的可读性会降低。有其他的解决方法吗?

在Ruby中,函数定义是与其他语句(如赋值等)完全一样执行的语句。这意味着在解释器执行"def check_data"语句之前,check_data并不存在。因此,函数必须在使用之前定义。

一种方法是将函数放在一个单独的文件"data_functions "中。
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是面向对象的,在某些时候,您可能最终会将逻辑包装到对象中,而不仅仅是编写单独的函数。

Andrew Grimm提及END;还有BEGIN

foo "hello"

BEGIN {
def foo (n)
  puts n
end}

你不能用它来初始化变量,因为{}定义了一个局部变量范围。

您可以使用END(大写,而不是小写)

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

但是那就有点麻烦了。

基本上,END代码运行后,所有其他代码运行。

编辑:

还有Kernel#at_exit, (rdoc的链接)

您可以将函数放在另一个文件中,并在脚本的顶部发出请求。

将初始调用封装在函数中,并在最后调用该函数:

# 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

相关内容

  • 没有找到相关文章

最新更新