Ruby中at_exit和END(大写)之间的差异

时间:2012-07-30 23:56:59

标签: ruby keyword

Kernel#at_exit方法与END(全部大写)关键字之间存在哪些差异(如果有)?后者仅仅是一种更为Perlish的做事方式,前者更像是Ruby-esque吗?

我尝试了defined?(END {puts "Bye"}),但语法错误。

2 个答案:

答案 0 :(得分:8)

“Ruby编程语言”定义了他们行为的微小差异。在循环内可以多次调用at_exit,并且在代码退出时执行每次迭代调用。 END只会在循环内被调用一次。

  

...如果END语句在循环内并被执行   不止一次,与之相关的代码仍然只注册一次:

a = 4;
if (true)
  END { # This END is executed
  puts "if"; # This code is registered
  puts a # The variable is visible; prints "4"
}
else
  END { puts "else" } # This is not executed
end
10.times {END { puts "loop" }} # Only executed once
  

内核方法at_exit提供了END语句的替代方法;它注册了一个   在解释器退出之前执行的代码块。与END块一样,   与第一个at_exit调用相关联的代码将在最后执行。如果是at_exit方法   在循环中多次调用,然后执行与之关联的块   解释器退出时多次。

所以,跑步:

2.times {
  END { puts 'END'}
  at_exit { puts 'at_exit' }
}

结果:

at_exit
at_exit
END

答案 1 :(得分:1)

在方法中使用END会产生警告,at_exit没有警告(尽管两者仍然有效):

def with_end
  END {puts 'with END'}
end

def with_at_exit
  at_exit {puts 'with at_exit'}
end

with_end
with_at_exit

输出:

$ ruby foo.rb 
foo.rb:2: warning: END in method; use at_exit
with at_exit
with END

在不太实际的层面上,END is a language keywordat_exit is a method in the language