Lua 学习笔记:贰
分类:技术
最近不是特别忙,于是就抽空开始继续看 PIL 了。
变量声明与 C 语言的不同
Lua 中有一个常见的用法,不论变量、函数都可以用下面这种方法保存到局部变量中(同时加快访问速度):
local foo = foo
书里加了个括号来解释这种写法:
The local
foo
becomes visible onlyafter
its declaration.
这一点需要瞎扯的是 C 语言里相应的东西。
int foo = 12;
int bar = 6;
void foobar(void)
{
int foo = foo;
int bar[bar];
}
与 Lua 不同,在 C 语言中初始赋值是声明之后的事情。所以这里函数 foobar
中的 foo
会被初始化为自己(而不是全局的 foo
,所以值不确定),bar
却被合法地定义为一个含有 6 个元素的数组。
看似多余的限制
另一个有趣的现象是在 4.4 节中说到:
For syntactic reasons, a
break
orreturn
can appear only as the last statement of a block; in other words, as the last statement in your chunk or just before anend
, anelse
, or anuntil
.
乍一看觉得加上这个限制真是麻烦,但想想这不正是 break
/return
的正确用法么?因为其后的语句都永远不会被执行到,所以如果不是在块的最后写 break
/return
是毫无意义的(调试除外)。虽然看上去是挺多余的一段话,但也算是说出了事物的本源。
函数的本质
第六章 More About Functions 中说到我们平时在 Lua 中写的函数声明
function foo (x) return 2*x end
其实是一种语法糖,本质上我们可以把它写成如下代码:
foo = function (x) return 2*x end
于是也就可以说
- Lua 中的所有函数都是匿名函数,之前所谓「具名函数」只是保存了某个匿名函数的变量罢了。
- Lua 中的函数声明其实只是一个语句而已。
终于有用的知识
在第 47 页看到了一段令人泪流满面的代码和运行结果:
function derivative (f, delta)
delta = delta or 1e-4
return function (x)
return (f(x + delta) - f(x))/delta
end
end
c = derivative(math.sin)
print(math.cos(10), c(10))
--> -0.83907152907645 -0.83904432662041
最初我并不知道 derivative 是什么意思,但看了示例代码和运行结果,顿时恍然大悟:这货不就是导数吗?
高数里的东西竟然真的在现实生活中出现了!顿时觉得世界真美好 =ω=