《Lua程序设计》--学习8

news2024/11/26 19:36:15

编译,执行和错误

编译

可以认为dofile函数就是这样:

 loadfile函数从文件中加载Lua代码段,但它不会运行代码,只是编译代码,然乎将编译后的代码段作为一个函数返回

函数loadfile更灵活。在发生错误的情况中,函数loadfile会返回nil及错误信息,以允许我们按自定义的方式来处理错误

如果需要多次运行同一个文件,那么只需调用一次loadfile函数后再多次调用它的返回结果即可

函数load与函数loadfile类似,不同之处在于该函数从一个字符串或函数中读取代码段,而不是从文件中读取

 在这句代码执行后,变量f就会变成一个被调用时执行i=i+1的函数

 如果要编写一个用后即弃的dostring函数(例如加载并运行一段代码),那么我们可以直接调用函数load的返回值

load(s) ()

不过,如果代码中有语法错误,函数load就会返回nil和形如“试图调用一个nil值(attempt to call a nil value)”的错误信息。为了更清楚地展示错误信息,最好使用函数assert

assert(load(s)) ()

 函数load最典型的用法是执行外部代码(即那些来自程序本身之外的代码段)或动态生成的代码。例如,我们可能想运行用户定义的函数,由用户输入函数的代码后调用函数load对其求值。请注意,函数load期望的输入是一段程序,也就是一系列的语句。如果需要对表达式求值,那么可以在表达式前添加return,这样才能构成一条返回指定表达式值的语句

 由于函数load所返回的函数就是一个普通函数,因此可以反复对其进行调用

我们也可以使用读取函数(reader function)作为函数load的第1个参数。读取函数可以分几次返回一段程序,函数load会不断地调用读取函数直到读取函数返回nil(表示程序段结束)。作为示例,以下的调用与函数loadfile等价

f  = load(io.lines(filename,"*L"))

 代码段中可以声明局部变量

 函数load和函数loadfile从来不引发错误。当有错误发生时,它们会返回nil及错误信息

此外,这些函数没有任何副作用,它们既不改变或创建变量,也不向文件写入等。这些函数只是将程序段编译为一种中间形式,然后将结果作为匿名函数返回。一种常见的误解是认为加载一段程序也就是定义了函数,但实际上在Lua语言中函数定义是在运行时而不是在编译时发生的一种赋值操作

 当执行f = loadfile("foo.lua")时编译foo的命令并没有定义foo,只有运行代码才会定义它

 预编译的代码

Lua语言会在运行源代码之前先对其进行预编译。Lua语言也允许我们以预编译的形式分发代码。

错误

由于Lua语言是一种经常被嵌入在应用程序中的扩展语言,所以当错误发生时并不能简单地崩溃或退出。相反,只要错误发生,Lua语言就必须提供处理错误的方式。

Lua语言会在遇到非预期的情况时引发错误。

我们也可以显式地通过调用函数error并传入一个错误信息作为参数来引发一个错误。通常,这个函数就是在代码中提示出错的合理方式

 错误处理和异常

如果要在Lua代码中处理错误,那么就应该使用函数pcall(protected call)来封装代码

假设要执行一段Lua代码并捕获(try-catch)执行中发生的所有错误,那么首先需要将这段代码封装到一个函数中,这个函数通常是一个匿名函数。之后,通过pcall来调用这个函数

 函数pcall会以一种保护模式(protected mode)来调用它的第1个参数,以便捕获该函数执行中的错误。无论是否有错误发生,函数pcall都不会引发错误。如果没有错误发生,那么pcall返回true及被调用函数(作为pcall的第1个参数传入)的所有返回值;否则,则返回false及错误对象

我们可以通过error来抛出异常(throw an exception),然后用函数pcall来捕获(catch)异常,而错误信息则用来标识错误的类型

错误信息和栈回溯

模块和包

所有的标准库都是模块。我们可以按照如下的方法使用数学库

 使用表来实现模块的显著优点之一是,让我们可以像操作普通表那样操作模块,并且能利用Lua语言的所有功能实现额外的功能

函数require

以下这些用法都是正确的:

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

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

相关文章

100种思维模型之排列组合思维模型-78

说到模型,一般人会觉得特别难,会觉得是学霸级别的人才能做出来的高科技。 然实际上并不是! 西方人常说Model,模型在西方人眼里是一个非常常见的词。 查理芒格,多元思维模型倡导者和践行者,他说任何能够帮助…

Elasticsearch:实用 BM25 - 第 1 部分:分片如何影响 Elasticsearch 中的相关性评分

作者:Shane Connelly 背景 在 Elasticsearch 5.0 中,我们切换到 Okapi BM25 作为我们的默认相似度算法,这是用于对与查询相关的结果进行评分的算法。 在本博客中,我不会过多地介绍 BM25 与替代措施,但如果你想了解 B…

3天没睡吐血整理,性能测试瓶颈问题+分析,一篇概全...

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

白鲸优化算法优化VMD参数,并提取特征向量,以西储大学数据为例,附MATLAB代码

大家看到这篇文章,肯定会有疑问,难道本篇文章和上一篇文章不是一个意思嘛,这是来凑数的嘛……其实不然,如果各位读者仔细看,就会发现本篇文章和上一篇文章大有不同,这篇文章也是我一直以来想在上一篇文章基…

TALL论文笔记

TALL论文笔记 0.论文来源1摘要2引言3模型结构3.1视觉编码器3.2句子编码器3.3模态融合3.4时间定位回归网络 4训练4.1损失函数4.2采集训练样本 5 评估5.1数据集5.2评价指标5.3实验结果 0.论文来源 2017 TALL 1摘要 问题描述:通过语言来对未修剪视频中动作的时间定位…

【JVM】日志分析工具--gcviewer的使用

文章目录 gcviewer是什么?gcviewer的使用最后 gcviewer是什么? GCViewer是一个小工具,可以可视化Sun / Oracle、IBM、HP和BEA Java虚拟机生成的详细GC输出。它是在GNU LGPL下发布的自由软件。—官网翻译 gcviewer的使用 文章使用的配置 工具…

Dubbo面试题

Dubbo 基础知识为什么要用 Dubbo?Dubbo 是什么?Dubbo 的使用场景有哪些?Dubbo 核心功能有哪些? 架构设计Dubbo 服务器注册与发现的流程?Dubbo 的整体架构设计有哪些分层?Dubbo Monitor 实现原理? 分布式框…

一键部署通义千问预体验丨阿里云云原生 5 月动态

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。 本栏目每月更新。 01 趋势热点 🥇 Apache RocketMQ 入选可信开…

如何创建 GitHub 配置文件自述文件

背景 最近再搞GitHub Actions的东西。突然看到了 github推出的这项服务。就搞了一下。主要目的:装扮自己的GitHub主页。俗称装逼(小声) 步骤 创建一个与 GitHub 用户名同名(包括大小写)的新仓库。比如我的就是 创建…

Docker学习(一)

第1章 docker简介 1.1 什么是docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 …

ethers.js常用的操作方法

安装:npm install --save5.7.2 ethers --ethers比web3来说使用方式相对简洁很多,主要就操作三个大对象 1. Provider,(提供者)是一个用于连接以太坊网络的抽象类,提供了只读形式来访问区块链网络和获取链上…

8年测试老鸟总结,性能测试案例经验,高级测试之道...

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

测试员最令程序员讨厌的十种行为,你中了几条?

在做软件测试这些年,总会有程序员给我吐槽某某测试员令其发指的一些事。这里我总结了一些,看你有没有中呢? 1、爱较真,只要逮着问题,哪怕是技术文档中的错别字也要提到bug管理工具中,更让程序员绝望的是&a…

测试员与程序员那些烂在心里的共同秘密

1、生产环境出现了一个较严重的bug,赶在用户没发现的情况下,测试员与程序员悄悄地改了,并跳过了N个步骤做了次发布。 2、程序员告诉测试员,新来的技术leader每天做得最多的事就是copy他们的代码,一份不够还再来一份&a…

VR全景智慧园区,沉浸式数字化体验,720度全视角展示

导语: 随着科技的迅猛发展,虚拟现实(Virtual Reality,简称VR)全景技术已经成为了人们趋之若鹜的新兴领域。 而城市园区作为现代社会的重要组成部分,也正在积极寻求创新的方式来吸引更多的人流和投资。 一&…

【QQ界面展示-设置文本框的leftView属性 Objective-C语言】

一、这个搞定以后,接下来,就实现另外一个效果, 1.注意,我们上午把这个文本框,是不是本来说文本框,直接放这儿就OK了吧,但是,我们上午为了能让这个文本框兼容iOS6,是不是把这个文本框的边框,设为None,然后呢,边框设为nil边框,是不是设了一个背景图啊, 但我们做完…

Ansys Zemax | 如何在OpticStudio中建模和设计真实波片

本文介绍了如何在 OpticStudio 中建模和设计真实的单色和消色差波片。它将演示如何使用双折射材料,通过构建评价函数来计算相位延迟,并使用 Universal Plot 将相位延迟与波片厚度的关系可视化。(联系我们获取文章附件) 双折射材料…

搜索树的逻辑以及代码实现-重点删除结点的逻辑

目录 搜索二叉树概念 代码 二叉搜索树的插入 二叉搜索树的查找 二叉搜索树的删除(非常重要) a、b、c情况:删除14 d情况 打印结点中序遍历 整体代码:(有R开头的就是递归写法,逻辑一样) 搜…

合宙Air724UG Cat.1模块硬件设计指南--UART接口

UART接口 简介 串行接口简称串口,同时串口又分为同步收发串口与异步收发串口两种方式,而CAT1模块支持的串口为异步收发方式,简称UART口。串口作为设备的外部接口,是调试开发的一种重要的开发手段。 特性 UART1串口 包括数据线TXD…

ubuntu (Linux mint) 安装mysql 5.7

1 从官网下载deb格式安装包 网址: https://downloads.mysql.com/archives/community/ 2 解压安装包 执行命令: tar -xvf mysql-server_5.7.41-1ubuntu18.04_amd64.deb-bundle.tar 如下图所示: 你会发现多了很多.deb文件。 3 批量安装 .d…