Ruby中使用的保留字BEGIN或END是什么?

这是一个很难找到的词,因为在大多数情况下,它们在搜索过程中不敏感。 我在文档之外找到的最好的是IRB中的测试。

BEGIN{puts x = 10} 10 

因为所有关键字 BEGINEND都被记录为Object公共实例方法 (即使您不会看到它们从Object.public_instance_methods返回)

BEGIN通过代码块指定在程序开始顺序执行之前无条件执行的代码。 有时用于模拟对方法的前向引用。

 puts times_3(gets.to_i) BEGIN { def times_3(n) n * 3 end } 

END通过代码块指定在程序终止之前执行的代码。

 END { puts "Bye!" } 

编程Ruby实用程序员指南中的一些更详细的解释

BEGIN和END块

每个Ruby源文件都可以声明要在加载文件时运行的代码块(BEGIN块)以及程序执行完毕后(END块)。

 BEGIN { begin code } END { end code } 

程序可以包括多个BEGIN和END块。 BEGIN块按它们遇到的顺序执行。 END块以相反的顺序执行。

有一点没有提到,在早期版本的Ruby中, BEGIN是无条件的:

 if false BEGIN { puts "Up is down, hot is cold, good is evil!" } end 

如果您使用Ruby 1.8.7进行尝试,则会打印该句子,即使它是在未采用的分支中。

在Ruby 2.0.0下,在顶层之外使用BEGIN是一种语法错误(一种更智能的方法来处理它):

 unconditional.rb:2: BEGIN is permitted only at toplevel BEGIN { puts "Up is down, hot is cold, good is evil!" } ^ 

编辑 :在某种程度上,没有人回答你在评论中提出的问题:为什么Ruby有BEGIN ? 我会尽力。 BEGIN来自Perl的 Ruby(就像很多东西一样)。 Perl有它,因为它存在于awk 。 它在awk中很有意义,因为默认情况下, awk文件包含一系列模式和操作:

 /foo/ { print $1 } /bar/ { print $2 } 

检查每一行的每个模式。 如果模式匹配,则执行操作。 否则, awk会转到下一个模式。 所以在上面的迷你脚本中,如果该行匹配’foo’,则打印第一个字段。 如果该行与“bar”匹配,则打印第二个字段。

但到目前为止,您可以看到BEGIN (和END )块填充的空白:如果您想任何输入测试之前或者看到所有输入之后无条件地执行某些操作(如在报表顶部打印标题,该怎么办?或者在报告末尾打印一行总数)? 正常的awk线条模式+动作无法帮助你。

这就是BEGINEND存在的原因。 但我不确定它们对于现代的,惯用的Ruby脚本有多么有用。 但正如dbenhur在评论中指出的那样,你仍然可以很好地使用Ruby来实现类似awk的单行程序。 (我还记得MiniTest,标准的Ruby测试库,过去常常使用at_exit函数进行测试,但我不确定它是否会再进行测试。)

关于Ruby, awk和Ruby one-liners的两个很好的链接:

  • 由Ryan Tomayko创作的AWK-ward Ruby
  • Ruby单行

来自Ruby编程语言:


BEGINEND

每个Ruby源文件都可以声明要在加载文件时运行的代码块( BEGIN块)以及程序执行完毕后( END块)。

 BEGIN { # begin code } END { # end code } 

程序可以包括多个BEGINEND块。 BEGIN块按它们遇到的顺序执行。 END块以相反的顺序执行。


所以:

 $ cat beginend.rb END { puts :end } BEGIN { puts :begin } END { puts :end2 } BEGIN { puts :begin2 } puts :run $ ruby beginend.rb begin begin2 run end2 end 

BEGIN块正是您可能认为的那样,即给定的块将在程序中的其余代码之前运行。

这是一个例子。

 puts "Goodbye cruel world!" BEGIN { puts "Hello World!" } 

我希望有所帮助。

在minitest中有一个这样的工作示例 ,其中一组值被放在文件末尾,但首先进行评估。

使用-e选项处理流时,BEGIN / END非常方便。 例如,要合计一个数字文件:

 cat < numbers 1 5 10 20 EOF cat numbers | ruby -ane 'BEGIN { $t=0}; END {puts $t}; $t += $_.to_i' 

注意BEGIN如何将全局归零,并且END打印结果。

BEGIN和END也用于评论,例如:

 =begin This is a comment line It can explain what the rest of the program is about This was inspired from the perl style of programming =end 

你可以在这里查看相同的内容: https : //en.wikipedia.org/wiki/Comparison_of_programming_languages_(syntax)#Comments