Dou*_*len 22 ruby reserved-words
这是一个很难找到的词,因为在大多数情况下,它们在搜索过程中不敏感.我在文档之外找到的最好的是IRB中的测试.
BEGIN{puts x = 10}
10
Run Code Online (Sandbox Code Playgroud)
Mch*_*chl 23
作为所有关键字 BEGIN并被END记录为公共实例方法Object(即使你不会看到它们返回Object.public_instance_methods)
BEGIN通过代码块指定在程序开始顺序执行之前无条件执行的代码.有时用于模拟对方法的前向引用.
Run Code Online (Sandbox Code Playgroud)puts times_3(gets.to_i) BEGIN { def times_3(n) n * 3 end }END通过代码块指定要在程序终止之前执行的代码.
Run Code Online (Sandbox Code Playgroud)END { puts "Bye!" }
编程Ruby实用程序员指南中的一些更详细的解释
BEGIN和END块
每个Ruby源文件都可以声明要在加载文件时运行的代码块(BEGIN块)以及程序执行完毕后(END块).
Run Code Online (Sandbox Code Playgroud)BEGIN { begin code } END { end code }程序可以包括多个BEGIN和END块.BEGIN块按它们遇到的顺序执行.END块以相反的顺序执行.
Tel*_*hus 19
有一点没有提到,在早期版本的Ruby中,BEGIN是无条件的:
if false
BEGIN { puts "Up is down, hot is cold, good is evil!" }
end
Run Code Online (Sandbox Code Playgroud)
如果您使用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!" }
^
Run Code Online (Sandbox Code Playgroud)
编辑:在某种程度上,没有人回答你在评论中提出的问题:Ruby为什么会这样BEGIN?我会尽力.BEGIN来自Perl的 Ruby(就像很多东西一样).Perl拥有它,因为它存在于awk.它有很多意义,awk因为默认情况下,awk文件由一系列模式和操作组成:
/foo/ { print $1 }
/bar/ { print $2 }
Run Code Online (Sandbox Code Playgroud)
检查每一行的每个模式.如果模式匹配,则执行操作.否则,awk转到下一个模式.因此,在上面的迷你脚本中,如果该行匹配'foo',则打印第一个字段.如果该行匹配"bar",则打印第二个字段.
但是现在你可以看到BEGIN(和END)阻塞填充的差距:如果你想在任何输入测试之前或者在看到所有输入之后无条件地做某些事情(比如在报告顶部打印标题或打印)报告末尾的一行总数)?正常awk的模式+动作线无法帮助你.
这就是原因BEGIN和END存在.但我不确定它们对于现代的,惯用的Ruby脚本有多么有用.但正如dbenhur在评论中指出的那样,你仍然可以很好地使用Ruby,就像单行一样awk.(我还记得MiniTest,标准的Ruby测试库,曾经使用过一个at_exit函数进行测试,但我不确定它会再用了.)
关于Ruby awk和Ruby one-liners的两个很好的链接:
BEGIN和END块每个Ruby源文件都可以声明要在加载文件(BEGIN块)和程序执行完后(END块)之后运行的代码块.
BEGIN {
# begin code
}
END {
# end code
}
Run Code Online (Sandbox Code Playgroud)
程序可以包括多个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
Run Code Online (Sandbox Code Playgroud)
BEGIN块正是您可以假设的,也就是说给定的块将在程序中的其余代码之前运行.
这是一个例子.
puts "Goodbye cruel world!"
BEGIN {
puts "Hello World!"
}
Run Code Online (Sandbox Code Playgroud)
我希望有所帮助.
在minitest中有一个这样的工作示例,其中一组值被放在文件末尾,但首先进行评估.
| 归档时间: |
|
| 查看次数: |
4415 次 |
| 最近记录: |