Ruby 入门: BEGIN & END
BEGIN 块
BEGIN 块中的代码在所有代码执行之前执行,Ruby 允许设置多个 BEGIN 块并按出现的顺序执行块中的代码。C# 程序员注意下面的代码
上面的代码看上去很美吧,可惜的是上面的代码段会出现 parse error,正确的代码应该是
BEGIN 块中的代码在所有代码执行之前执行,Ruby 允许设置多个 BEGIN 块并按出现的顺序执行块中的代码。C# 程序员注意下面的代码
BEGIN
{
print "OnInit(object sender, EventArgs args)\n"
}
BEGIN
{
print "OnLoad(object sender, EventArgs args)\n"
}
print "Running"
{
print "OnInit(object sender, EventArgs args)\n"
}
BEGIN
{
print "OnLoad(object sender, EventArgs args)\n"
}
print "Running"
上面的代码看上去很美吧,可惜的是上面的代码段会出现 parse error,正确的代码应该是
BEGIN{
print "OnInit(object sender, EventArgs args)\n"
}
BEGIN{
print "OnLoad(object sender, EventArgs args)\n"
}
print "Running"
print "OnInit(object sender, EventArgs args)\n"
}
BEGIN{
print "OnLoad(object sender, EventArgs args)\n"
}
print "Running"
正如上面的代码段所呈现的,只有当起始大括号和 BEGIN 标识符位于同一行时块内的代码才能得到正确的执行。同时 BEGIN 块也不受任何控制结构的影响,因为只要出现 BEGIN 块就会得到执行并且只执行一次。
1i = 0
2while i < 10
3 # 虽然处理循环结构中,但 BEGIN 块内的代码仍然只执行一次
4 BEGIN{
5 print "OnInit(object sender, EventArgs args)\n"
6 }
7 i += 1
8end
9
10if false
11 # BEGIN 完全不受 if 的影响,只要出现 BEGIN 块就会得到执行
12 BEGIN{
13 print "OnLoad(object sender, EventArgs args)\n"
14 }
15end
16
17print "Running"
2while i < 10
3 # 虽然处理循环结构中,但 BEGIN 块内的代码仍然只执行一次
4 BEGIN{
5 print "OnInit(object sender, EventArgs args)\n"
6 }
7 i += 1
8end
9
10if false
11 # BEGIN 完全不受 if 的影响,只要出现 BEGIN 块就会得到执行
12 BEGIN{
13 print "OnLoad(object sender, EventArgs args)\n"
14 }
15end
16
17print "Running"
基于只要现出 BEGIN 就会得到执行和 BEGIN 在所有代码执行之前执行的原则,即使 BEGIN 块前出现了代码,该代码仍然会等待 BEGIN 块执行之后再执行。比如下面的代码段输出结果仍然是 OnInit - OnLoad - Running。
print "OnLoad(object sender, EventArgs args)\n"
BEGIN{
print "OnInit(object sender, EventArgs args)\n"
}
print "Running"
BEGIN{
print "OnInit(object sender, EventArgs args)\n"
}
print "Running"
END 块
END 块与 BEGIN 块相反,在所有代码执行之后执行,多个 END 块时最先出现的 END 块最后执行。除此之外,END 块虽然不受 while 的影响,但是可能通过 if 来控制 END 块的执行与否。比如下面代码的输出结果就是 Start - Load - Unload。
END 块与 BEGIN 块相反,在所有代码执行之后执行,多个 END 块时最先出现的 END 块最后执行。除此之外,END 块虽然不受 while 的影响,但是可能通过 if 来控制 END 块的执行与否。比如下面代码的输出结果就是 Start - Load - Unload。
if false
END{
# 永远不输出
print "Init"
}
end
END{
# 最后输出
print "Unload\n"
}
END{
# 先于 Unload 输出
print "Load\n"
}
# 最先输出
print "Start\n"
END{
# 永远不输出
print "Init"
}
end
END{
# 最后输出
print "Unload\n"
}
END{
# 先于 Unload 输出
print "Load\n"
}
# 最先输出
print "Start\n"