lua闭包的理解以及表与函数的几种表达方法

前一段时间,在学习lua语言时,看lua中文教程,在读闭包这一节时,看了好几遍,对闭包这个概念还是很模糊,不能清楚的理解它是怎么回事

最近工作不是很忙,所以就自学了一些lua的知识,但是才看了两个多小时就遇见了一个问题——闭包。好吧,我是看见它第一眼的时候以为是和close之类有关的巴拉巴拉。。。。(原谅我的无知)!但是越往下看越迷茫,所以就网上看了好多大师写的东西学习学习,特此记录一下,以便日后看到不会。。。。。被人鄙视

在lua中函数也是变量,可以存储在表中,也可以是函数的参数,或是返回值,其实是个lua 的闭包大概可以理解成这个样子 闭包(函数名){功能抽象, upvalue, env},功能抽象就是函数体了,

upvalue: 是内嵌函数可以访问外包函数已经创建的所有局部变量,这些局部变量称为该内嵌函数的外部局部变量(external local variable)或者upvalue,upvalue实际指的是变量而不是值。

function newCounter()
 local i = 0
 return function()
 i = i + 1
  return i
 end
end

在上面的例子中i就是一个upvalue

简单的说闭包是一个函数加上它可以正确访问的 upvalue。upvalue是嵌套函数的外部函数的局部变量。这个函数一般定义在另一个函数内部;他可以访问定义在外部函数内的成员变量,参数,以及全局函数。并且这个函数还可以返回函数。

表和函数

一:

Lib = {}
Lib.foo = function (x,y) retrun x+ y end
Lib.goo = function(x)retrun x end;

二:

Lib = {
foo = function (x,y) retrun x+ y end
goo = function(x)retrun x end;
}

三:

Lib = {}
Lib = {}
functio Lib.foo (x,y) retrun x+ y end
 function Lib.goo (x)retrun x end;

以上就是对lua的闭包和表与函数的理解,有需要的小伙伴可以参考下。

(0)

相关推荐

  • LUA中的闭包(closure)浅析

    之前对closure一知半解,在网上也找不到一篇文章能把它说清楚,今天好像第一次对它有点清晰的了解 了,写个BLOG记念一下 lua的函数是一种 First-Class Value 的东西, 到底是啥? 就是它们与传统类型的变值没啥区别, 可以 存到一个变量中, 可以 存到table中, 可以 作为实参传递给其它函数, 可以 作为其它函数的返回值. 它们还具有特定的词法域(Lexical Scoping), 也就是说, 一个函数可以嵌套在另一个函数中, 内部的函数可以访问外部函数中的变量. 如下

  • Lua中的闭包学习笔记

    之前介绍 Lua 的数据类型时,也提到过,Lua 的函数是一种"第一类值(First-Class Value)".它可以: 存储在变量或 table (例如模块和面向对象的实现)里 复制代码 代码如下: t = { p = print } t.p("just a test!") 作为实参(也称其为"高阶函数(higher-order function)")传递给其他函数调用 复制代码 代码如下: t = {2, 3, 1, 5, 4} table

  • Lua中的闭包小结

    前言 在很多语言中都有闭包的概念,而在这里,我将主要对Lua语言的闭包概念进行分析与总结.希望对大家学习Lua有帮助. 什么是闭包? 闭包在Lua中是一个非常重要的概念,闭包是由函数和与其相关的引用环境组合而成的实体.我们再来看一段代码: 复制代码 代码如下: function newCounter()      local i = 0      return function () -- 匿名函数           i = i + 1           return i      end

  • Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记

    赋值语句 注释,单行用(--)来表示:多行用(--[[ ... ]])来标示: 定义,lua中没有定义(申明数据类型),它是通过赋值来确定其数据类型的. 赋值,是改变一个变量的值和改变表域的最基本的方法. a = "hello" .. "world" Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量.a, b = 10, 2*x <--> a=10; b=2*x 遇到赋值语句Lua会先计算右边所有的

  • Lua进阶教程之闭包函数、元表实例介绍

    复制代码 代码如下: function createCountdownTimer(second)    local ms=second * 1000;    local function countDown()       ms = ms - 1;    return ms;  end  return countDown; end timer1 = createCountdownTimer(1); for i=1,3 do    print(timer1()); end print("-----

  • Lua学习笔记之函数、变长参数、closure(闭包)、select等

    1. Lua函数支持多返回值,但并不是每次调用函数返回的全部值都会被使用. 有一条规则是只有当函数调用是表达式最后一个元素时,才会使用它的全部返回值.看代码: 复制代码 代码如下: --string.find函数返回两个值,:被查找子串的开始索引和结束索引  s,e = string.find("Lua program language","Lua")  print(s,e)  --> 1    3    --如果找不到,则输出nil和nil  s,e = s

  • Lua学习笔记之表和函数

    Lua中的表和函数比较重要,正是因为二者的结合才完成了很多很多的功能,Lua才变得如此的强大,所以有必要仔细的学习一下表和函数.如下的代码体现了表的用法. --表 --可以使用构造器来初始化表,表是Lua特有的功能强大的东西.最简单的构造函数是{},用来创建一个空表. local days = {"xiao", "ta", "hello", "lua"} --第一个元素索引为1,以后的类推,这一点和其他语言的第一个元素索引是0

  • lua闭包的理解以及表与函数的几种表达方法

    前一段时间,在学习lua语言时,看lua中文教程,在读闭包这一节时,看了好几遍,对闭包这个概念还是很模糊,不能清楚的理解它是怎么回事 最近工作不是很忙,所以就自学了一些lua的知识,但是才看了两个多小时就遇见了一个问题--闭包.好吧,我是看见它第一眼的时候以为是和close之类有关的巴拉巴拉....(原谅我的无知)!但是越往下看越迷茫,所以就网上看了好多大师写的东西学习学习,特此记录一下,以便日后看到不会.....被人鄙视 在lua中函数也是变量,可以存储在表中,也可以是函数的参数,或是返回值,

  • C++中strlen函数的三种实现方法

    目录 一.strlen函数是什么 二.strlen的三种实现方法 1.第一种方法(直接) 2.第二种方法(递归) 3.第三种方法(指针-指针) 四.小结 一.strlen函数是什么 我们经常用到strlen这个函数求字符串长度,但是它是怎么实现的呢?接下来让给我用三种方法带你们看看它是如何实现? 首先我们先来了解一下strlen这个函数,strlen 是求字符串长度的函数,它的返回值是size_t,就是unsigned int.字符串以'\0'作为结束标志,strlen函数返回的值就是在字符串中

  • JavaScript定义函数的三种实现方法

    JavaScript定义函数的三种实现方法 [1]正常方法 function print(msg){ document.write(msg); } 对函数进行调用的几种方式: 函数名(传递给函数的参数1,传递给函数的参数2,-.) 变量 = 函数名(传递给函数的参数1,传递给函数的参数2,-.) 对于有返回值的函数调用,也可以在程序中直接使用返回的结果,例如:alert("sum=" + square(2,3)); 不指定任何函数值的函数,返回undefined. [2]构造函数方法 

  • JavaScript函数的4种调用方法实例分析

    本文实例讲述了JavaScript函数的4种调用方法.分享给大家供大家参考,具体如下: JavaScript 函数有 4 种调用方式: 1. 作为一个函数调用 2. 函数作为方法调用 3. 使用构造函数调用函数 4. 作为函数方法调用函数 分述如下: 每种方式的不同方式在于 this 的初始化. 作为一个函数调用 function myFunction(a, b) { return a * b; } myFunction(10, 2); // myFunction(10, 2) 返回 20 以上

  • python函数的两种嵌套方法使用

    目录 交叉嵌套 回环函数 python函数的两种嵌套方法使用函数的嵌套有两种方式: 交叉嵌套 回环嵌套 交叉嵌套 交叉嵌套的方式是在本函数中调用同一级或上一级函数的嵌套方法: def func(foo):     print(1)     foo()     print(3)      def a():     print(1) b = func(a) print(b) 输出的结果为: 113None 首先,程序会将 Python 文件中顶格的代码运行.函数 func 和 a 都是先开辟内存空间

  • JavaScript箭头函数的五种使用方法及三点注意事项

    目录 使用 简略编写 结合解构赋值 结合扩展运算符 this指向的改变 绑定this 注意细节 关于构造 关于参数对象 关于yield命令 面试题 前言: 箭头函数是ES6新增的定义函数的方式,我们可以使用()=>{}来顶替以前的函数定义方式,下面从五个使用姿势与三点注意事项来刨析箭头函数. 使用 简略编写 当我们箭头函数函数只有一个参数的时候是可以将()省略,当代码块只有一行的时候可以将{}与return省略 const fn = num => num.sort(); console.log

  • JavaScript函数的4种调用方法详解

    在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而非像C#或其他描述性语言那样仅仅作为一个模块来使用.函数有四种调用模式,分别是:函数调用形式.方法调用形式.构造器形式.以及apply形式.这里所有的调用模式中,最主要的区别在于关键字 this 的意义,下面分别介绍这个几种调用形式. 本文主要内容: 1.分析函数的四种调用形式2.弄清楚函数中this的意义3.明确构造函对象的过程4.学会使用上下文调用函数 一.函数调用形式 函数调用形式是最常见的形式,也是最

  • js function定义函数的几种不错方法

    js function定义函数的4种方法 1.最基本的作为一个本本分分的函数声明使用. 复制代码代码如下: 复制代码 代码如下: function func(){} 或 var func=function(){}; 2.作为一个类构造器使用: 复制代码代码如下: 复制代码 代码如下: function class(){} class.prototype={}; var item=new class(); 3.作为闭包使用: 复制代码代码如下: 复制代码 代码如下: (function(){ //

  • JavaScript表单验证的两种实现方法

    本文实例为大家分享了js表单验证的实现方法,供大家参考,具体内容如下 第一种:js表单验证 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册-个人用户</title> <meta http-equiv="pragma" content="no-cache"

  • php 防止表单重复提交两种实现方法

    php 防止表单重复提交 由于网络原因,经常出来点了提交按钮,网页没有反应,而进行再次点击.这样就导致后台收到两次提交,从而进行两次处理,本文章向大家介绍php 防止表单重复提交的几种方法 1.前端解决 方法一: 可以通过前端来解决.当用户点了提交按钮之后,先使用js进行有效性判断,没问题后,将提交按钮"禁用"掉.然后再提交! 方法二: 使用ajax提交表单.点了提交按钮后,禁用提将按钮,或者设置一个状态值,将其设为1,表示正在提交.再提交时判断如果正在提交,则不作处理.等ajax返回

随机推荐