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

news2024/9/20 23:23:05

在这里插入图片描述

文章目录

  • Require
  • 短路判断实现三目运算符


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

上述语句和三目运算符的作用是一样的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802608.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

亚马逊云科技全新Amazon Bedrock,助力客户构建生成式AI应用

亚马逊云科技近日在纽约峰会上宣布全面扩展其全托管基础模型服务Amazon Bedrock,包括新增Cohere作为基础模型供应商,加入Anthropic和Stability AI的最新基础模型,并发布变革性的新功能Amazon Bedrock Agents功能。客户无需管理任何基础设施&a…

ceph集群中RBD的性能测试、性能调优

文章目录 rados benchrbd bench-write测试工具Fio测试ceph rbd块设备的iops性能测试ceph rbd块设备的带宽测试ceph rbd块设备的延迟 性能调优 rados bench 参考:https://blog.csdn.net/Micha_Lu/article/details/126490260 rados bench为ceph自带的基准测试工具&am…

OnnxRuntime TensorRT OpenCV::DNN性能对比(YoloV8)实测

1. 前言 之前把ORT的一套推理环境框架搭好了,在项目中也运行得非常愉快,实现了cpu/gpu,fp32/fp16的推理运算,同onnx通用模型在不同推理框架下的性能差异对比贴一下,记录一下自己对各种推理框架的学习状况 YoloV8模型大小 模型名称参数量NANO3.2M...... 2. CPU篇 CPU推理框架性…

【三维重建】SceneRF:基于NeRF的自监督单目三维场景重建

文章目录 摘要一、前言二、方法2.1.用于新的深度合成的NeRF3.1.1 深度估计 3.2 概率射线采样 (PrSamp)3.3 球形Unet(SU-net)3.4.场景重建方案 四、实验总结 摘要 从二维图像的三维重建被广泛的研究,训练与深度监督。为了放松对昂贵获取的数据…

火爆全网,Charles抓包教程-辅助接口测试(一)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 charles是一款非常…

【C++进阶】多态的理解

一.多态是什么 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。 对于多态,不同的对象传过去,会调用不同的函数; 即多态调用看的是指向的对象。 //A,B类中的func函数是个多态 class A { pu…

自制Nuget包(C#)

自制Nuget包 自制C# Nuget包。 目的: 生成一个可以通过Nuget管理自动应用的包,生成效果如图: 步骤: 整个制作过程分为两步:第一步制作Nuget包,第二步上传Nuget包到Nuget网站(地址&#xf…

Redis实战(2)——互斥命令用于构建分布式锁

1 什么是分布式锁 在单体应用中,线程锁是可以让多个线程串行执行一段代码逻辑的。不过在集群环境或者是分布式的环境下,线程锁无法保证线程串行运行,从而出现线程安全的问题。 根本的原因在于,在 集群分布式环境下 \textcolor{r…

F12 浏览器调试模式页面刷新 network 日志刷新消失的解决办法

每次请求刷新后都把之前的请求记录刷新掉了,把preserve log勾选上后,所有的请求都会保留,再也不怕抓不到记录了。

配置 gitlab https 访问

文章目录 1. 备份2. 生成SSL证书3. 配置文件4. 重启5. 访问 1. 备份 docker exec -ti gitlab-ce gitlab-rake gitlab:backup:create2. 生成SSL证书 yum install openssl openssl-devel -y mkdir /data/gitlab/config/ssl ; cd /data/gitlab/config/ssl### 生成证书 openssl…

郑州Sectigo DV通配符SSL证书

我们在浏览器访问网页时或许不会注意到网站是http还是https链接,但是一定能注意到浏览器给我们展示的“不安全”警告,警告访问者网站未加密,访问网站会有泄露隐私的危险。SSL证书能将网站链接由http转为https,对网站传输数据加密&…

数据科学复现

片段 线性回归建模步骤.py 用sklearn做简单的一元线性回归.py 红用逻辑回归实现红酒数据分类py 高斯朴素贝叶斯分类py

uni-app如何生成正式的APK

第一步: 进入dcloud官网https://dcloud.io/,点击开发者后台进入登录注册页面 第二步:登录之后跳到项目列表,选择自己想要打包的项目 点击进去如果没有生成证书,点击生成证书,如果显示证书已生成就不用管了…

什么样的程序员在35岁后仍然保持竞争力?

作为程序员,大家肯定都听说过程序员的35岁危机,有的人刚入职程序员这个岗位就开始为自己的未来担忧,然而,与其担心自己35岁以后被优化掉,不如现在想想,怎么让自己到了35岁以后在这个岗位上依旧有竞争力。今…

【Python】在PyCharm中安装 ChatGPT 插件,让 AI 帮助我们写代码,从此代码再无报错,小白也能轻易上手!!!

前言 ChatGPT是目前最强大的AI,不仅能够聊天、写小说,甚至码代码也不在话下。 但是在国内要使用chatgpt很麻烦,国内一家团队开发了一款idea插件NexChatGPT,用数据代理的方式,让我们在国内也能轻松的使用chatgpt。 没…

【图像去噪】基于进化算法——自组织迁移算法(SOMA)的图像去噪研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

亚马逊云科技联合霞光社发布《2013~2023中国企业全球化发展报告》

中国企业正处于全球聚光灯下。当企业全球化成为时代发展下的必然趋势,出海也从“可选项”变为“必选项”。中国急速扩大的经济规模,不断升级的研发和制造能力,都在推动中国企业不断拓宽在全球各行业的疆域。 过去十年,是中国企业…

Unity XML1——XML基本语法

一、XML 概述 ​ 全称:可拓展标记语言(EXtensible Markup Language) ​ XML 是国际通用的,它是被设计来用于传输和存储数据的一种文本特殊格式,文件后缀一般为 .xml ​ 我们在游戏中可以把游戏数据按照 XML 的格式标…

SOLIDWORKS 运行缓慢?了解如何诊断SOLIDWORKS大型装配性能问题?

在打开装配时,您的SOLIDWORKS运行缓慢吗?或者不仅打开时间慢,每次点击、旋转或缩放都会产生延迟。 好消息是,我们是可以改善装配加载性能的,困难的部分是需要知道从哪里入手。本文中,我们将研究如何诊断SO…