【Lua学习笔记】Lua进阶——Require,三目运算

这篇具有很好参考价值的文章主要介绍了【Lua学习笔记】Lua进阶——Require,三目运算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Lua学习笔记】Lua进阶——Require,三目运算,Lua学习笔记,lua,学习,笔记


Require

这是文件aaa.lua的内容

aaa.lua:
a = 10
local b = 20
print("我是aaa")

这是文件example.lua的内容

example.lua:
a = 100
print(a)
require("aaa") --require调用其他脚本文件
print(a)
print(b)
print("###我是分割线###")
print(package.loaded["aaa"]) -- true
package.loaded.aaa = nil --卸载脚本语句
print(package.loaded["aaa"]) --nil

输出:
100
我是aaa
10
nil
###我是分割线###
true
nil

可以看到,在使用require之后,会直接对其他文件进行调用执行。而且我们可以直接访问它的全局变量,并且发现我们的全局变量被覆盖了,而它的局部变量就像private一样,不能被这个文件访问。

package.loaded这个方法我们可以猜到了,package是一个table,里面存放了另一个table叫做loaded,这个loaded里面会把require的脚本以脚本名作为索引来存放,直接将其置为nil就相当于卸载脚本了。

为什么变量a从100变为了10?我认为不是调用了aaa.lua的变量a,而是example.lua的变量a被覆盖了。让我们验证一下:
这是文件aaa.lua的内容

function a()
    print("我是aaa")
end
print(a)
a()

这是文件example.lua的内容

function a()
    print("我是example")
end
print(a)
a()
require("aaa")
print(a)
a()
print(package.loaded["aaa"])
package.loaded.aaa = nil
print(a)
a()

输出:
function: 00C1C500
我是example
function: 00C1C660
我是aaa
function: 00C1C660
我是aaa
true
function: 00C1C660
我是aaa

从打印信息可以看出,首先我们定义的方法a()被存放到了00C1C500这个地址,而执行require之后a()的地址变为了00C1C660,而整个地址正是aaa.lua文件定义的方法a的地址。即使卸载之后example.lua文件的a地址依旧是00C1C660。这说明example.lua中同名的变量确实被重定义了。虽然我没看过源码,我严重怀疑require("aaa")就是顺序执行了除了带有local关键字语句的aaa.lua的文件。

通过打印_G表我们发现local变量确实没有被存入该文件的全局变量。并且即使本文件定义local变量也不会被存进去,说明_G表就是一个存放全局变量的表。

综上所述:

  • require("文件名")可以执行require的文件,并且获取内部的全局变量,如果本地变量名重复,先赋值的会被覆盖。其他文件定义的local变量不会被访问。
  • package是一个table,里面存放了另一个table叫做loaded,这个loaded里面会把require的脚本以脚本名作为索引来存放,直接将其置为nil就相当于卸载脚本

短路判断实现三目运算符

Lua中是没有三目运算符的,但是我们可以用逻辑判断伪装一个三目运算符
让我引用一下我在【Lua学习笔记】Lua入门中写的

逻辑判断(Lua很特殊,这个比较重要)

Lua认为false和nil为假,true和非nil为真,所以0代表也是真。 唯一需要注意的是Lua中不等于为 ~= 与或非分别是and or not

接下来用T代表真,F代表假,?代表任意bool
print(F and ?)
在进行and运算的时候,如果第一个值就为false,那输出值一定为false,?是什么都不影响了,所以结果一定为false,输出F即可
print(T and ?)
在进行and运算的时候,如果第一个值为true,我们依然无法确定输出值,此时我们需要知道?是true还是false
但是最后的运算结果一定是由?决定的,如果?为true运算就是true,问号为false运算就是false,所以and左值为真时,输出的结果一定是右值
因此该语句会输出 ?
print(T or ?)
同理,or运算中如果左值为true,结果一定为true,因此输出T即可
print(F or ?)
or运算中如果左值为false,最后结果则是由?是true还是false决定,因此输出结果一定是右值
上述语句输出 ? 

上述判断被称为短路判断,我们可以利用短路实现一个三目运算符

x,y=1,2
res = (x > y) and "yes" or "no"
print(res)
x,y=2,1
print(res)

输出:
no
yes

上述语句和三目运算符的作用是一样的文章来源地址https://www.toymoban.com/news/detail-612155.html

到了这里,关于【Lua学习笔记】Lua进阶——Require,三目运算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Lua学习笔记】Lua进阶——Table(3) 元表

    接上文 Q:为什么要使用元表? A:在Lua中,常常会需要表与表之间的操作。元表中提供了一些元方法,通过自定义元方法可以实现想要的功能,相当于面向对象中给你一系列方法让你重载。 使用下列代码设置元表: 通常在元表中操作分为三步: 操作子表 检测是否有元表 若

    2024年02月15日
    浏览(36)
  • 【Lua学习笔记】Lua进阶——Table,迭代器

    在【Lua学习笔记】Lua入门中我们讲到了Lua的一些入门知识点,本文将补充Lua的一些进阶知识 在上篇文章的最后,我们指出通过查询_G的字符索引,发现table.insert实际上是一个名为table的table结构里的索引指向的函数 实际上不仅它,所有的函数,模块,全局变量,元表 😅😅😅

    2024年02月15日
    浏览(36)
  • 【Lua学习笔记】Lua进阶——Table(4)继承,封装,多态

    现在我们可以像面向对象一样,new一个对应基类的对象了。但是这里的new也不完全相似与面向对象的new,例如我们可以这样做: 我们在封装Object类的时候可完全没有name这个索引,而在Lua中我们new了一个新对象,还能新加入一些变量和方法,这些特性明显是继承了父类的子类才

    2024年02月15日
    浏览(51)
  • Lua 进阶 · 教程笔记

    笔记的内容出自 Bilibili 上的视频:Lua教程-进阶部分 - 4K超清【不定期更新】 笔记主要用于供笔者个人或读者回顾知识点,如有纰漏,烦请指出 : ) 国内的大佬 云风 翻译了 Lua 的 Api 参考手册:传送门【】 以后读者在练习或者开发途中可以在参考手册里查看 Lua 提供的 Api。

    2024年01月24日
    浏览(55)
  • lua学习-2 常见运算符

    普通赋值 多重赋值 交换赋值 常见符号标识 加 + 减 - 乘 * 除 / 取模 % 指数 ^ 常见符号标识 等于 == 不等于 ~= 大于 小于 大于等于 = 小于等于 = TIP 关系运算符的结果只能是true或者false 对于对象类型的数据(function,userdata,table) 等于比较的是其地址值 常见符号标识 与 and (其他语

    2024年02月15日
    浏览(36)
  • 【Lua学习笔记】Lua入门

    (不是教程,推荐有编程基础的人观看本文) 文中主要包含了对菜鸟教程中的一些学习理解,个人感觉Lua语言和Python很多地方相似 以下大部分代码和表格摘抄自菜鸟教程 数据类型 描述 nil 只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)(类似与Null或者

    2024年02月15日
    浏览(36)
  • lua学习笔记21完结篇(lua中的垃圾回收)

    输出 学习地址  【唐老狮】Unity热更新之Lua语法_哔哩哔哩_bilibili 

    2024年04月15日
    浏览(45)
  • lua学习笔记

    单行注释: 多行注释: 命名: Lua不支持下划线+大写字母,比如:_ABC 但支持:_abc : 全局变量: 直接变量名 = 内容就是全局 局部变量: 加上local即可 nil: nil是空的意思,即什么也没有 lua的数据类型: table: lua从下表为1开始的 if else elseif: nil默认为false ..: ..为字

    2024年02月07日
    浏览(41)
  • lua脚本语言学习笔记

    Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 因为我们使用redis的时候一般要写lua脚本,这篇文章就介绍一下lua脚本语言的基础用法。 window操作系统下可以使用SciTE来

    2024年02月16日
    浏览(49)
  • lua语法学习笔记(速成版)

    使用官方的浏览器测试网站进行代码测试。wiki.loatos.com 创建变量 类似python,直接赋值即生成全局变量; 加 local 变成 仅本文件使用变量; 数据类型 nul和number 未被声明(或叫创建)的值都是 nul,类似NULL。 number 数值型,支持16进制表示法和科学计数法。 字符串 单引号

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包