这是一个非常难以找到的词,因为在大多数情况下,在搜索过程中它们不敏感。
除了文档外,我能找到的最好的东西是在IRB中进行测试。
BEGIN{puts x = 10}
10
这是一个非常难以找到的词,因为在大多数情况下,在搜索过程中它们不敏感。
除了文档外,我能找到的最好的东西是在IRB中进行测试。
BEGIN{puts x = 10}
10
所有的关键字BEGIN
和END
都被记录为Object
的公共实例方法(尽管你不会从Object.public_instance_methods
中看到它们返回)
BEGIN通过代码块指定,在程序顺序执行之前无条件执行的代码。 有时用于模拟对方法的前向引用。
puts times_3(gets.to_i)
BEGIN {
def times_3(n)
n * 3
end
}
END通过代码块指定在程序终止之前执行的代码。
END {
puts "Bye!"
}
来自《Programming 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中执行此操作,即使它在未执行的if
分支中,该句子也会被打印出来。
在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借鉴而来的。Perl 之所以有它,是因为它在awk
中存在。在awk
中使用它是很有意义的,因为默认情况下,一个awk
文件由一系列模式和动作组成:
/foo/ { print $1 }
/bar/ { print $2 }
每行都会检查所有模式,如果匹配则执行操作,否则awk
将移至下一个模式。因此,在上面的小脚本中,如果行匹配'foo',则打印第一个字段。如果行匹配'bar',则打印第二个字段。
但是现在你可以看到BEGIN
(和END
)块所填补的空白:如果您想要做一些无条件的事情,例如在任何输入被测试之前打印标题或在报告结尾处打印一行总计(如何?正常的awk
模式+操作行不能帮助你实现。
这就是为什么BEGIN
和END
存在的原因。但我不确定它们对于现代、惯用的Ruby脚本有多有用。但正如dbenhur在评论中指出的那样,你仍然可以很好地使用Ruby编写类似于awk
的一行命令。(我还记得标准的Ruby测试库MiniTest曾经使用at_exit
函数进行测试,但我不确定它是否仍然在使用。)
两个关于Ruby、awk
和Ruby one-liners的好链接:
BEGIN
和END
的历史。 - Telemachus-an
或 -ap
。它非常适用于组合 awk 风格的命令行单行程序,通常比 awk
本身更具能力和表现力。 - dbenhur以下内容翻译自 《Ruby编程语言》
BEGIN
和 END
代码块每个 Ruby 源文件都可以声明在加载文件时运行的代码块(BEGIN
代码块)和程序执行完后运行的代码块(END
代码块)。
BEGIN {
# begin code
}
END {
# end code
}
一个程序可能包含多个BEGIN
和END
块。 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!"
}
BEGIN/END在使用-e选项处理流时非常方便。例如,要对数字文件进行求和:
cat <<EOF > numbers
1
5
10
20
EOF
cat numbers | ruby -ane 'BEGIN { $t=0}; END {puts $t}; $t += $_.to_i'
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