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

jw5wzhpr  于 2023-08-08  发布在  Ruby
关注(0)|答案(5)|浏览(103)

在我的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之前调用了它。好吧,我可以把定义放在文件的顶部,但这样的话,在我看来,文件的可读性就不那么强了。还有其他变通办法吗?

kpbwa7wx

kpbwa7wx1#

在Ruby中,函数定义是与其他语句(如赋值等)执行的语句。这意味着直到解释器调用了“def check_data”语句,check_data才不存在。所以函数在使用之前必须定义。
一种方法是将函数放在一个单独的文件“data_functions.rb”中,并要求它在顶部:

require 'data_functions'

字符串
如果你真的想把它们放在同一个文件中,你可以把你所有的主逻辑都 Package 在自己的函数中,然后在最后调用它:

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是面向对象的,在某个时候,你可能最终会把逻辑 Package 到对象中,而不仅仅是编写单独的函数。

xdnvmnnf

xdnvmnnf2#

Andrew Grimm提到END;也有开始

foo "hello"

BEGIN {
def foo (n)
  puts n
end}

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

lg40wkob

lg40wkob3#

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

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

字符串
但那就有点麻烦了
基本上,END代码是在所有其他代码运行之后运行的。

**编辑:**还有Kernel#at_exit,(rdoc链接)

hm2xizp9

hm2xizp94#

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

6uxekuva

6uxekuva5#

将初始调用 Package 在一个函数中,并在最后调用该函数:

# 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

字符串

相关问题