繁体   English   中英

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

[英]Differences between at_exit and END (upper case) in Ruby

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

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

“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

在方法中使用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是一个语言关键字 ,而at_exit是该语言中的一种方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM