开发者

Ruby: How to call function before it is defined?

开发者 https://www.devze.com 2023-02-28 01:48 出处:网络
In my seeds.rb file I would like to have the following structure: # begin of variables initialization groups = ...

In my seeds.rb file I would like to have the following structure:

# begin of variables initialization
groups = ...
# end of variables initialization
check_data
save_data_in_database

# functions go here
def check_data
  ...
end
def save_开发者_如何学Godata_in_database
  ...
end

However, I got an error because I call check_data before it is defined. Well, I can put the definition at the top of the file, but then the file will be less readable for my opinion. Is there any other workaround ?


In Ruby, function definitions are statements that are executed exactly like other statement such as assignment, etc. That means that until the interpreter has hit your "def check_data" statement, check_data doesn't exist. So the functions have to be defined before they're used.

One way is to put the functions in a separate file "data_functions.rb" and require it at the top:

require 'data_functions'

If you really want them in the same file, you can take all your main logic and wrap it in its own function, then call it at the end:

def main
  groups =  ...
  check_data
  save_data_in_database
end

def check_data
  ...
end

def save_data_in_database
  ...
end

main # run main code

But note that Ruby is object oriented and at some point you'll probably end up wrapping your logic into objects rather than just writing lonely functions.


Andrew Grimm mentions END; there's also BEGIN

foo "hello"


BEGIN {
def foo (n)
  puts n
end}

You can't use this to initialize variables because the {} defines a local variable scope.


You could use END (upper case, not lower case)

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

but that'd be a bit of a hack.

Basically, END code is run after all other code is run.

Edit: There's also Kernel#at_exit, (rdoc link)


You could put the functions on another file and make a request on the top of the script.


Wrap your initial calls in a function and call that function at the end:

# 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
0

精彩评论

暂无评论...
验证码 换一张
取 消