【精选】3. 函数与面向对象.pdf

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
【精选】3. 函数与面向对象

3. 函数与⾯向对象 变量声明与 C 语⾔的不同 Lua 中有⼀个常见的⽤法,不论变量、函数都可以⽤下⾯这种⽅法保存到局部变量中 ( 时加快访问速度): local foo = foo 书⾥加了个括号来解释这种写法: The local foo becomes visible only after 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 or return can appear only as the last statement of a block ; in other words, as the last statement in your chunk or ust before an end , an else , or an until . 乍⼀看觉得加上这个限制真是⿇烦,但想想这不正是 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 是什么意思,但看了⽰例代码和运⾏结果,顿时恍然⼤ 悟:这货不就是导数吗? 沙 背景知识 Lua 给我的感觉是:各种内置函数和标准库的存在感都是⽐较强的。如果执⾏这句: for name in pairs(_G) do print(_G) end 就会把各种环境中已存在名称的打印出来: 全局变量:⽐如字符串 _VERSION 。 内置函数:⽐如 print 、tonumber 、dofile 之类。 模块名称:⽐如 string、io、coroutine 之类。 这⾥的全局变量 _G 就是存放环境的表 (于是会有 _G 中存在着 _G ._G 的递归)。 于是,平时对于全局变量的访问就可以等 于对 _G 表进⾏索引: value = _G[varname] -- value = varname _G[varname] = value -- varname = value 改变函数的环境 函数的上下⽂环境可以通过 setfenv(f , table) 函数改变,其中 table 是新的环境表,f 表 ⽰需要被改变环境的函数。如果 f 是数字,则将其视为堆栈层级 (Stack Level ),从 ⽽指明函数 (1 为当前函数,2 为上⼀级函数): a = 3 -- 全局变量 a setfenv(1, {}) -- 将当前函数的环境表改为空表 p

文档评论(0)

tazhiq2 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档