我一直试图寻找这个问题的答案,但未能成功。我想知道,do-end 块实际上是用来做什么的?它只是说在我的书中需要时使用值,那么我该如何使用它呢?
我是否可以通过将函数放置在 do-end 循环中并将局部变量放置在函数外部但在此 do-end 块内并且变量将被函数看到来使用它来减少局部变量的范围?那么这个函数还能被调用吗?
抱歉说得很含糊。我希望这是有道理的。也许一个插图示例可能有用^^
do-end 块与变量作用域问题有关。本质上,当您使用标识符时,它有什么价值?例如,当我们编写以下程序时,会打印哪些数字?
local x = 10
if x > 0 then
local x = 17
print(x)
end
print(x)
当涉及到局部变量时,Lua 使用标准的词法作用域,正如在第 4.2 节 http://www.lua.org/pil/4.2.html《Lua 编程》一书中的内容。词法作用域非常有用,原因如下:
变量作用域是静态的。只需查看源代码,您就知道代码中的每个标识符对应哪些变量和函数。这与 Bash 中的动态作用域或通过方法调用或数组查找进行间接分派相反,在 Bash 中,您需要考虑程序的执行流程才能知道最终会得到什么值。
-
变量作用域是有限的,这有助于提高可读性并避免一些错误:
词法作用域使一些非常有表现力的习语 http://www.lua.org/pil/6.1.html当你将它与嵌套函数(闭包)结合起来时。
通常,您不需要担心自己指定变量范围。函数、循环和条件自动引入新的作用域,这通常足以为您的变量提供良好的约束作用域。也就是说,每隔一段时间,您可能想凭空引入一些额外的范围,我们可以使用 do-end 来实现这一点。 Lua 编程有以下示例,您要计算二次方程的解,并且计算有一些临时值:
do
local a2 = 2*a
local d = sqrt(b^2 - 4*a*c)
x1 = (-b + d)/a2
x2 = (-b - d)/a2
end -- scope of `a2' and `d' ends here
print(x1, x2)
没有 do-end 块,a2
and d
在不再需要它们后可能会被意外使用:
local a2 = 2*a
local d = sqrt(b^2 - 4*a*c)
x1 = (-b + d)/a2
x2 = (-b - d)/a2
print(x1, x2)
print(a2) -- OOPS! I wanted to say "print(a)"
也就是说,do-end 不需要经常使用。如果代码块较小,则隐藏局部变量的需要较少,如果代码块较大,则将代码块放入其自己的子例程中通常是更好的方法。我发现 do-end 闪耀的时候是当你只需要进行一次计算时 - 函数可能会被调用多次,但如果你使用 do-end 块,你会清楚地知道你只运行那段代码一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)