lua学习之深入函数第一篇

深入函数第一篇

  1. 函数是第一类值,具有特定的词法域

第一类值

  1. 第一类值的意思是函数与 lua 中的其他类型如数字,字符串具有相同的权力
  2. 函数可以存储到全局变量或局部变量变量,还可以存储到 table 中
  3. 可作为实参传递给其他函数,也可以作为其他函数的返回值

词法域

  1. 定义:一个函数可以嵌套在另一个函数中,内部函数可以访问外部函数定义的局部变量
  2. 函数与其他所有的值一样都是匿名的,没有名称
  3. 讨论print()函数时,相当于在讨论值仅为 print()变量
a = {p = print}
a.p("Hello World") -- Hello World
c = print
c("eee") -- eee
print = math.sin
a.p(print(math.pi / 2)) -- 1
sin = a.p
sin(10, 20) -- 10 20

function foo(x)
    return 2 * x
end
-- 等价于
foo = function (x) return 2 * x end

匿名函数

  1. 一个函数定义可以是一条赋值语句,这样的函数表达式可以视为函数构造式,这种函数构造式的结果称为匿名函数
  2. 一般会将函数赋予全局变量
function foo(x)
    return 2 * x
end
-- 等价于
foo = function(x) return 2 * x end

高阶函数

  1. table.sort()这样的函数接收另一个函数作为实参的函数就称它为高阶函数
-- table.sort 对 table 中的所有元素进行排序
network = {
    {name = "atest", IP = "255.255.255.0",}
    {name = "btest2"}, IP = "255.255.255.1"},
    {name = "ctest3"}, IP = "255.255.255.3"},
    {name = "dtest4"}, IP = "255.255.255.4"},
}
table.sort(network,
    function (a, b)
        return (a.name > b. name)
    end
)
-- 导数 (f(x + d) - f(x)) / d 函数在某一个点处的导数
function derivative (f, delta)
    delta = delta or 1e-4
    return function (x)
            return (f(x + delta) - f(x)) / delta
        end
end
-- sin 的导数是 cos
c = derivative(math.sin)
print(math.sin(1), c(1))
print(math.sin(1), math.cos(0)) 

闭合函数

names = {"Pe", "Tu", "Me"}
grades = {Pe = 10, Tu = 5, Me = 8}
table.sort(names, function (x, y)
            return grades[x] > grades[y]
        end
    )
-- 按照年级进行排序
print(names[1], names[2], names[3])

function sortByGrade(names, grades)
    table.sort(names, function (x, y)
            return grades[x] > grades[y]
        end
    )
end
sortByGrade(names, grades)
  1. 匿名函数中调用外部函数的形参的变量称为非局部变量。
  2. 一个 closure 就是一个一个函数加上该函数所需访问的所有「非局部变量」
  3. 如果再次调用 newCounter ,那么他会创建一个新的局部变量 i 从而也会得到一个新的 closure
function newCounter()
    local i = 0
    return function ()
        i = i + 1
        return i
    end
end
c1 = newCounter()
print(c1()) -- 1
print(c1()) -- 2 

-- 重新定义 sin 函数,弧度转为角度
oldSin = math.sin
math.sin = function (x)
    return oldSin(x * math.pi / 180)
end

do
    local oldSin = math.sin
    local k = math.pi / 180
    math.sin = function (x)
        return oldSin(x * k)
    end
end

-- 限制一个程序访问文件
do
    local oldOpen = io.open
    local access_OK = function (filename, mode)
      -- <检查访问权限的代码>
    end
    io.open = function (filename, mode)
        if access_OK(filename, mode) then
            print("允许访问")
            return oldOpen(filename, mode)
        else
            print("不允许访问")
            return nil, "access denied"
        end
    end
end

原文地址:https://www.cnblogs.com/door-leaf/p/12354235.html

时间: 2024-08-29 06:49:55

lua学习之深入函数第一篇的相关文章

lua学习笔记之函数

Lua学习笔记之函数 1.  函数的作用 函数主要完成指定的任务,这样的情况下函数作为调用语句使用,函数可以计算并返回值,这样的情况下函数作为赋值语句的表达式使用. 语法: funcationfunc_name(arguments-list) Statements-list end 调用函数的时候,如果参数列表为空,必须使用()表示是函数调用. Print(8*9,9/8) a = math.sin(3) +math.cos(10) print(os.date()) 上述规则有一个例外,当函数只

lua学习之类型与值篇

类型与值 lua 是动态类型的语言 在语言中没有类型定义的语法 每个值都携带有它的类型信息 8种基础类型 用 type 可以返回这个值的类型的名称 将一个变量用于不同类型,通常会导致混乱的代码 但合理使用,如异常情况下返回 nil ,以区别正常情况下的其他类型的返回值 变量没有预定义的类型,任何变量都可以包含任何类型的值 print(type("Hello")) --string print(type(666)) --number a = print print(type(a)) --

21000+行原生J S的学习之路(第一篇)

学习JS已经有一年多了(小白),看了很多书,也写了不少代码,但是总感觉功力还是不够(哈哈),前段时间偶然接触到原生JS代码,边对此产生了兴趣,学习原生JS对于我们深入了解js有很好的帮助比如函数的参数类型.返回值类型等.下来先介绍一下原生JS的语法结构,来帮助大家更好的学习和阅读原生JS: declare function eval(x: string): any; 上面这个就是我们常见的eval函数在原生JS中的写法,括号中X为函数的参数,':'后面为参数的类型,最外层':'后面为调用函数返回

Lua学习笔记3. 函数可变参数和运算符、转义字符串、数组

1. Lua函数可以接受变长数目的参数,和C语言类似,在函数的参数列表中使用(...)表示函数可以接受变长参数 lua函数将参数存放在一个table中,例如arg,那么#arg可以获得参数的个数 function func_no_p(...) local arg={...} for k,v in pairs(arg} do print(v ..",") end print("输入参数个数:".. #arg) end func_no_p(1,2,34,1,"

Python学习之路【第一篇】-Python简介和基础入门

1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是一种开发语言,而且已经进阶到主流的二十多种开发语言的top 5(数据源自最新的TIOBE排行榜). 来头不小啊!二十多种主流的开发语言,我该从哪一个开始呢?人生苦短,let‘s python! 1.2 Python的由来和发展趋势 Python的前世源自鼻祖“龟叔”.1989年,吉多·范罗苏姆(Gu

【PostgreSQL学习之旅】第一篇:Linux和Windows下安装PostgreSQL9.4

一.简介 PostgreSQL是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等:其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务.子查询.多版本并行控制系统(MVCC).数据完整性检查等特性的唯一的一种自由软件的数据库管理系统. 二.Linux下安装 1) 环境:RedHat Enterprise 6.5 x64(2.6.32-431.el6.x86_64) PostgreSQL

python学习之旅【第一篇】简介和入门

python简介: 一.什么是python pythonde 设计哲学是:“优雅”.“明确”.“简单” 二.python由来  1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.之所以选中Python作为程序的名字,是因为他是BBC电视剧——蒙提·派森的飞行马戏团(Monty Python‘s Flying Circus)的爱好者. 三.Python能做什么 Web程序 Python经常被用于Web开发.比如,通过mod_ws

Python学习之路(第一篇)

Python简介 Python前世今生: Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. 现在,全世界差不多有600多种编程语言,但流行的编程语言也就那么20来种.如果你听说过TIOBE排行榜,你就能知道编程语言的大致流行程度.这是最近10年最常用的10种编程语言的变化图: 由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到业内的认可!!! Python可以应用于众多领域,如:数据

学习笔记 第九周 第一篇

1. 电力电子器件 电力电子器件根据其导通和关断可控性的不同可以分为以下三类. 1. 不可控型器件,即导通与关断都不能控制的器件.仅整流二极管是不可控器件. 2. 半控型器件,即只能控制其导通,不能控制其关断的器件.普通晶闸管SCR及其派生器件属于半控型器件. 3. 全控型器件,即导通与关断都可以控制的器件.GTR.GTO.IGBT等都属于全控型器件. 2. 电力变换电路 由电力电子器件与相应控制电路组成的电力变化电路,按其功能可分为下列几种类型. 1. 可控整流电路 2. 交流调压电路 3.