Lua学习笔记

2023-05-16

neovim 0.5正式版本已经发布了,现在学习Lua语言还来的及吧。lua替换vim脚本渐渐成为了趋势了。

Lua学习下来,感觉与javascript特别的像。就是代码块不是使用{}分割,而是end,需要习惯一下。代码阅读问题不大,自己写代码还是要适应一下。

Lua中有一些好玩的语法,用起来比Java,Javascript简单,爽!

我学习的教程文档:
https://www.lua.org/pil/contents.html

文章写的简单明了,推荐阅读。

文章目录

  • table.sort排序
    • ip地址按名称排序
    • 学生按年级排序
    • 学生按年级自定义函数排序
  • Closures
    • Lua版本
    • Javascript版本
    • Java版本
  • Non-Global Functions
    • 写法
    • 递归局部函数的定义
  • 相关文档

table.sort排序

ip地址按名称排序

network = {
	{name = "grauna",  IP = "210.26.30.34"},
	{name = "arraial", IP = "210.26.30.23"},
	{name = "lua",     IP = "210.26.23.12"},
	{name = "derain",  IP = "210.26.23.20"},
}


table.sort(network,function (a,b)
	return (a.name > b.name)
end)

print("输出")
for _,line in ipairs(network) do
	print(line.name)
end

学生按年级排序

names = {"Peter","Paul","Mary"}
grades= {Mary =10,Paul =7,Peter=8}

table.sort(names,function (n1, n2)
	return grades[n1] > grades[n2]
end)

print("------输出排序结果------")
for _,line in ipairs(names) do
	print(line)
end

学生按年级自定义函数排序

示例中有趣的一点是给定的匿名函数sort 访问参数grades,该参数对于封闭函数来说是本地的sortbygrade。在这个匿名函数内部, grades既不是全局变量也不是局部变量。我们称它为外部局部变量或upvalue。(术语“upvalue”有点误导,因为它grades是一个变量,而不是一个值。然而,这个术语在 Lua 中有历史渊源,它比“外部局部变量”短。)

names = {"Peter","Paul","Mary"}
grades= {Mary =10,Paul =7,Peter=8}

function sortbygrade(names,grades)
	table.sort(names,function(n1,n2)
		return grades[n1] > grades[n2]
	end)
end

sortbygrade(names,grades)

print("------输出排序结果------")
for _,line in ipairs(names) do
	print(line)
end

https://www.lua.org/pil/6.1.html

Closures

Lua版本

这个特性跟我想像的不太一样。

So, c1 and c2 are different closures over the same function and each acts upon an independent instantiation of the local variable i. Technically speaking, what is a value in Lua is the closure, not the function. The function itself is just a prototype for closures. Nevertheless, we will continue to use the term “function” to refer to a closure whenever there is no possibility of confusion.

因此,c1和c2是同一函数上的不同闭包,每个闭包都作用于局部变量的独立实例化i。从技术上讲,Lua 中的值是闭包,而不是函数。函数本身只是闭包的原型。尽管如此,只要没有混淆的可能性,我们将继续使用术语“函数”来指代闭包。

function newCounter()
	local i = 0
	return function () --匿名函数
		i = i + 1
		return i
	end
end

c1 = newCounter()
print(c1()) -->1
print(c1()) -->2

c2 = newCounter()
print(c2())  -->1
print(c1())  -->3
print(c2())  -->2

这样的写法我以前基本没用过,为了测试我的理解,我写了个javascript版本的。执行结果竟然一样的。看来是我一直理解的有问题。

Javascript版本

结果与Lua版本一至。

function newCounter(){
	let i = 0;
	return function(){
		i = i+1;
		return i;
	}
}

let c1 = newCounter()
console.log(c1()); //>1
console.log(c1()); //>2

let c2=newCounter()
console.log(c2());//>1
console.log(c1());//>3
console.log(c2());//>2

Java版本

我就思考如何在java中写出类似的代码呢?Java中好像没有匿名方法吧?

	public static void main(String[] args) {
        System.out.println(newCounter());//>1
        System.out.println(newCounter());//>1
        System.out.println(newCounter());//>1
    }

    public static int newCounter() {
        int i = 0;
        return i + 1;
    }

显然这样写是不对的,估计要用匿名内部类的方式处理吧。
为了模拟上面的逻辑,我使用java中的类实现。执行结果一至。

public class Main {
    public static void main(String[] args) {
        class NewCounter{
            int i =0;
            public NewCounter() {
            }
            @Override
            public String toString() {
                i = i+1;
                return String.valueOf(i);
            }
        }
        NewCounter c1 = new NewCounter();
        System.out.println(c1);//>1
        System.out.println(c1);//>2

        NewCounter c2 = new NewCounter();
        System.out.println(c2);//>1
        System.out.println(c1);//>3
        System.out.println(c2);//>2
    }
}

总结:
Closures中的变量感觉类似与Java中的类属性,很个实例单独管理。

Non-Global Functions

写法

Lib = {}
    Lib.foo = function (x,y) return x + y end
    Lib.goo = function (x,y) return x - y end

 Lib = {
      foo = function (x,y) return x + y end,
      goo = function (x,y) return x - y end
    }

Lib = {}
    function Lib.foo (x,y)
      return x + y
    end
    function Lib.goo (x,y)
      return x - y
    end

递归局部函数的定义

错误的❌

local fact = function (n)
      if n == 0 then return 1
      else return n*fact(n-1)   -- buggy
      end
    end

正确✅

 local fact
    fact = function (n)
      if n == 0 then return 1
      else return n*fact(n-1)
      end
    end

现在fact函数内部指的是局部变量。它在定义函数时的值无关紧要;到函数执行时, fact已经有了正确的值。这就是 Lua 为本地函数扩展其语法糖的方式,因此您可以将其用于递归函数而无需担心:

 local function fact (n)
      if n == 0 then return 1
      else return n*fact(n-1)
      end
    end

相关文档

https://www.lua.org/pil/contents.html#P1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lua学习笔记 的相关文章

  • kali新手入门教学(16)--如何在校园网下使用桥接模式上网

    emmm很长时间都没有更新了 卑微的我要准备期末考 然后返校什么的耽误了 xff0c 对不起大家啦 再次感谢大家的支持啦 刚收拾完我的寝室 xff0c 打开电脑登上校园网 ip变化很大 xff0c 这也是大家经常遇见的情况 xff0c 本地
  • React Native 兼容ios与android的弹出提示toast

    由于 iOS 没有内置的 toast 功能 xff0c 因此 React Native 开发人员必须实现自己的跨平台 toast 库 react native root toast是开发人员与 React Native 社区共享的一种解决方
  • Unable to resolve module react-native-pager-view

    报错信息 Unable to resolve module react native pager view from home apex wp expo jsjs node modules 64 ant design react nativ
  • Expo开发Field: splash.image - cannot access file at ‘./assets/splash.png‘

    报错信息 Error Problems validating asset fields in app json Learn more https docs expo io Field splash image cannot access f
  • Expo开发的App如果获取版本信息

    如何获取版本信息 xff0c 实际上很简单 但是我第一次使用expo获取版本信息 xff0c 还是查看了好多expo的文档才找到 所以就记录一下吧 版本信息配置app json span class token punctuation sp
  • React Native每次进入页面执行一次方法

    问 xff1a 有什么办法 可以在我每次进入页面的时候 执行一次方法吗 因为我看rn的生命周期 都是只执行一次 然后在下次进入的时候就不会再执行方法了 答 xff1a 在function组件中可以这样实现 xff1a span class
  • http隧道Chisel

    http隧道有啥用呢 xff1f 有些服务器封端口或者封协议只能走http协议 远程维护机器很不方便 xff0c 可能要VPN 43 堡垒机 xff0c 甚至还有限制了ssh客户端的 这里我就会考虑使用http隧道的方式 同类文章推荐 xf
  • Sockets代理的使用简介

    如果拥有了Sockets代理服务后 xff0c 应该如何使用它呢 xff1f 本文就简单介绍一下 xff0c 本人的经验分享 浏览器代理 以firefox为例 xff0c 其他浏览器类似 很简单 xff0c 看下图应该就能明白 设置好代理后
  • cannot drop a user that is currently connected

    删除用户时 xff0c 提示正在连接的用户无法删除 那就强制断开连接吧 xff01 错误信息 SQL span class token operator gt span drop user usr sg cascade span class
  • ModuleNotFoundError: No module named ‘setuptools_rust‘

    我在执行pip3 install webssh遇到以下的报错信息 报错信息 Traceback most recent call last File line 1 in File tmp pip build my9sai1o cryptog
  • 无限渗透实战(2)--绕过认证上校园网

    校园网大家都熟悉 一般都是开放的 xff0c 然后连接之后有个登录页面 xff0c 认证之后就可以上网了 xff0c 那么我们怎么绕过认证直接上网 首先还是开始监听周围的ap 可以看到有许多的校园网 那么我们就需要开始监听周围的校园网 xf
  • spring boot jar自定义端口启动

    java jar spring zs 1 0 jar server port span class token operator 61 span 9090
  • CentOS7中安装五笔输入法

    使用vnc远程了一点服务 xff0c 远程维护 GNOME默认自带的是ibus输入平台 默认有一个拼音输入法 但是我日常使用五笔打拼音还是不太习惯 xff0c 那就安装个五笔输入吧 相关阅读 xff1a Centos7安装和配置VNC服务器
  • CentOS7下vscode无响应

    原因分析 xff1a 我以前安装vscode是可以正常使用的啊 为什么现在不行了呢 xff1f 我怀疑会不会是新版的兼容性不行 我安装的是code 1 58 2 1626302881 el8 x86 64 rpm 后来在看到这篇文章 Cen
  • Bad owner or permissions on ~/.ssh/config

    ssh运行报错如下 xff1a Bad owner or permissions on ssh config 解决办法 span class token function chmod span 600 ssh config 参考 https
  • java.lang.NoClassDefFoundError: org/owasp/encoder/Encode

    一个老的spring boot项目中使用到了shiro xff0c 存在安全漏洞 xff0c 由于源码丢失 xff0c 只好采用解压jar升级里面shiro的jar来解决了 但是升级以后遇到报错如下 报错信息 Caused by java
  • A VNC server is already running as :1

    现象 VNC服务使用 Centos7安装和配置VNC服务器 GNOME篇 https blog csdn net lxyoucan article details 113179208 中的配置方法 一开始服务都是正常的 xff0c 在我多次
  • CentOS7+IntellJ IDEA 中文输入问题

    心血来潮在CentOS7中搭建了java开发环境 xff0c 发现在IDEA中输入中文存在问题 中文输入法只能输入1到2个中文 xff0c 后面都是英文了 xff0c 那就想办法解决一下吧 xff01 环境 我的环境信息如下 xff1a 项
  • CentOS7安装CMakev3.21.0

    yum 安装的CMake版本是 2 8 12 2 xff0c 比较旧无法使用 那就来升级一下吧 cmake span class token keyword span CMake Error at CMakeLists txt 1 span
  • CentOS7+VNC+Openbox+Fcitx

    文章目录 简介VNCopenboxFcitx 实战环境信息安装与自动配置脚本创建用户开启 VNC服务 客户端连接VNC实现远程控制假如vnc中输入法切不出来参考 简介 VNC VNC xff08 Virtual Network Comput

随机推荐

  • vnc学习笔记合集

    文章目录 CentOS7 43 VNC 43 Openbox 43 FcitxCentOS中VNC常用命令Centos7安装和配置VNC服务器 GNOME篇Centos7安装和配置VNC服务器 Xfce篇Centos7安装和配置VNC服务器
  • linux_pwn(3)--Chunk Extend and Overlapping&&roarctf_2019_easy_pwn

    文章目录 What is Chunk Extend and Overlappingpwn题思路例题保护机制add函数show函数delete函数edit函数 开始做题准备框架调试覆盖后面一个块的大小释放堆块free验证机制尝试修改堆块开始泄
  • 2021CentOS7系统Gnome3桌面使用Fcitx

    前言 CentOS系统大多是用于服务器上 xff0c 当作桌面系统使用的比较少数了 就算偶而使用CentOS当作桌面系统使用 xff0c Gnome3桌面自带的输入法框架ibus简单使用已经够用了 最近在CentOS7当作桌面系统当临时开发
  • CentOS7安装搜狗输入法

    搜狗拼音输入法是2006年6月由搜狐公司推出的一款汉语拼音输入法 搜狗输入法从一开始偏向于词语输入特性 xff0c 发展到后来配备云输入功能的以整句输入为优势的输入法 xff0c 是中国大陆市场主流的汉语拼音输入法 根据极光大数据的 201
  • CentOS7一键安装搜狗输入法

    自动档 span class token function sh span c span class token string 34 span class token variable span class token variable s
  • CentOS7一键开启VNC服务脚本

    最近在研究舒适 xff0c 小巧 xff0c 好用的图形界面远程控制 输入法这块卡了我很久时间 xff0c 经过一周的努力 xff0c 查资料无数 xff0c 终于打造出一套可以令自己满意的远程方案了 我的工作中接触的远程Linux服务系统
  • shell用户输入数字加法操作

    用户输入2个数字进行加法操作 span class token builtin class name echo span span class token string 34 请输入数字1 34 span span class token
  • 浅谈linux文件权限

    权限介绍 访问权限 读取 xff08 r xff09 xff1a 允许查看文件内容 xff0c 显示目录列表写入 xff08 w xff09 xff1a 允许修改文件内容 xff0c 允许在目录中新建 删除 移动文件或者子目录可执行 xff
  • Linux实用脚本分享

    源码 xff1a https gitee com lxyoucan tools CentOS7专用脚本 因为我平时接触的大部分机器都是CentOS7 这里的脚本都是针对CentOS7开发的 虽然个人比较喜欢新的软件 xff0c 喜欢arch
  • react踩坑之函数名(){}与函数名=()=>{}的区别

    在React Component组件中 xff0c 函数不同的写法有什么区别 最近在看书 xff0c 照着写敲代码 xff0c 敲完后发现与书上效果不一样 找了很久才找到区别 打这个小坑记录下来 xff0c 这个应该新手比较容易犯的错 结论
  • chrome全屏

    有一些web网站可能当作单独的应用使用 如果全屏显示 xff0c 不显示地址栏 让更多的区域给应用呢 xff1f 首先说一下 xff0c 我用的是Macos系统 xff0c 其他系统的参数应该是类似的 MacOS MacOS配置别名 默认的
  • expo cli升级后无法iOS模拟器调试Request failed with status code 400

    国内expo的教程和文档相对比较少 xff0c 记录下过程方便一下遇到相同问题的朋友们 现象 expo初次安装使用正常 xff0c 当升级expo cli到最新版本后 xff0c 无法正常使用iOS模拟器调试了 开启调试报错如下 xff1a
  • docker-compose 巧妙使用

    一般做ctf题目 xff0c 有时候题目给了docker 一般 docker compose up build d d表示运行成果后进入后台 这个命令不仅帮我们build image xff0c 也帮我们run了个容器 docker com
  • expo中使用react navigation 6.x笔记

    新版本react navigation 6 x xff0c 与5 x有什么区别呢 xff1f 记个笔记吧 xff01 文章目录 环境安装依赖安装 native stack navigator library示例 xff1a 导航到一个新的屏
  • windows10安装子系统Ubuntu 20.04

    很久之前就听说了windows10的子系统 因为平时用macOS比较多 xff0c 一直没有体验一把 最近切到windows环境下开发 xff0c 正好有空体验一把windows的子系统 文章目录 安装环境先决条件检查版本 实战程序与功能启
  • Termux配置neovim IDE

    之前玩Termux基本就是通过proot distro来安装Linux发行版本 xff0c 然后在发行版本中在配置neovim环境 这样比较简单一些 xff0c 遇到问题也可以直接网上搜索对应发行版本的解决办法就可以了 今天挑战一下直接在T
  • sed:-e 表达式 #1,字符 11:“s”的未知选项

    报错的命令 apex 64 localhost span class token function sed span i span class token string 34 s lt USER gt span class token en
  • 手机也有生产力,手把手教你用手机开发APP

    只有手机没有电脑 xff0c 能不能学编程 xff1f 能 xff01 今天的教程献给 xff0c 那些没有电脑但是对电脑或者编程有浓厚兴趣的同学 如果你有手机 xff0c 但是没电脑或者电脑不在身边 xff0c 也许这个教程能对你学习编程
  • coc-lua安装报错解决办法

    项目地址 xff1a https github com josa42 coc lua 现象 macOS中使用正常CentOS7有异常 环境CentOS7中 执行命令 CocInstall coc lua成功安装后 xff0c 重启nvim
  • Lua学习笔记

    neovim 0 5正式版本已经发布了 xff0c 现在学习Lua语言还来的及吧 lua替换vim脚本渐渐成为了趋势了 Lua学习下来 xff0c 感觉与javascript特别的像 就是代码块不是使用 分割 xff0c 而是end xff