Lua编译与运行

lua会首先把代码编译成中间码然后执行,或许大家都有所困惑:它不是解释性语言吗?其实lua作为解释性语言的意义在于其能在运行过程中完成编译工作,正是dofile、loadfile、require这种函数的存在,lua才能顺理成章地称自己为“解释性语言”。

dofile/loadfile/require

我们可以通过dofile函数实现在代码中动态加载一个lua文件并执行它:

-- file 'lib1.lua' 
function norm (x, y) local n2 = x^2 + y^2 return math.sqrt(n2) 
end 
function twice (x) return 2*x 
end
> dofile("lib1.lua") -- load your library 
> n = norm(3.4, 1.0) 
> print(twice(n)) --> 7.0880180586677

而loadfile和dofile的不同点在于loadfile只是负责加载lua文件而非执行,dofile在loadflie之后执行了一次,而且如若加载失败则第一时间返回错误信息。因此可以这么定义dofile的代码:

function dofile (filename) local f = assert(loadfile(filename)) return f() 
end

loadstring和loadfile类似,只不过接收的是需要执行的字符串而非文件路径。

require和dofile功能类似,但是值得注意的是require有两点不同:

  • require搜索目录加载文件
  • require会判断是否文件此前已经被require过,用以避免重复加载同一文件

require搜索目录加载文件

require的路径是一个模式列表,每一个模式指明一种虚文件名到实文件名的一种方法,比如require "some",模式列表为:?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua ,则会从左至右依次搜寻文件直至存在:

some

some.lua 

c:\windows\some 

/usr/local/lua/some/some.lua​​​​​​​.

有一个进阶技巧则是设置模式列表的最后一项为默认lua文件,比如以上模式列表可以是:?;?.lua;c:\windows\?;/usr/local/lua/?/?.lua;default.lua。这么设置的意义即在于未找到对应文件时可以加载默认的lua文件。

require判断是否重复加载

Lua自身保存了一个table用以筛查之前加载的文件名。注意这里保存的文件名为虚文件名,因此按照以上模式列表,如果require "some"且require "some.lua",则这个文件会同时加载两遍。

因此require的伪代码可以写作如下形式:

tbMode = {"?","?.lua","c:/windows/?","/usr/local/lua/?/?.lua"}
tbMap = {}
function requireMySelf(strPath)for i = 1,#tbMap doif strPath == tbMap[i] thenreturnendendfor i = 1,#tbMode doif loadfile(string.gsub(tbMode[i],"?","strPath")) thentable.insert(tbMap,strPath)breakendend
end

loadlib

标准C中进行动态库连接是很困难的一件事,但是lua可以通过loadlib的形式来实现动态库链接。通过传入动态链接库的绝对路径和初始化函数即可完成load,如若后续需要执行则需要显示调用以此这个变量即可:

local path = "/usr/local/lua/lib/libluasocket.so"
-- or path = "C:\\windows\\luasocket.dll" 
local f = assert(loadlib(path, "luaopen_socket")) 
f() -- actually open the library

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

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

相关文章

VUE基础知识(JAVA后端入门篇)

VUE基础知识(JAVA后端入门篇) Vue是一套前端框架,免除原生JavaScriptr中的DOM操作,简化书写基于MVVM(Model–View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上Vue.js - 渐进式 JavaScrip…

【python量化交易】qteasy使用教程02 - 获取和管理金融数据

qteasy教程2 - 获取并管理金融数据 qteasy教程2 - 获取并管理金融数据开始前的准备工作获取基础数据以及价格数据下载交易日历和基础数据查看股票和指数的基础数据下载沪市股票数据从本地获取股价数据生成K线图 数据类型的查找定期下载数据到本地回顾总结 qteasy教程2 - 获取并…

基于BitVM的乐观 BTC bridge

1. 引言 前序博客: 区块链互操作协议Bitcoin Bridge:治愈还是诅咒?BitVM:Bitcoin的链下合约 基于BitVM的乐观 BTC bridge: Trust-minimized two-way peg 机制 BitVM BTC bridge背后的主要思想是: 为比…

51单片机编程基础(C语言):电子时钟(LED1602作为显示)

题目要求: 审题时这个题是用数码管来显示的,数码管显示时钟我完成了一个,只是要求跟他不一样,所以这次想用LCD1602来显示,所以我先用LCD1602完成,再用数码管完成(其实也只要在我之前的项目基础…

如何学习机器学习和深度学习: 软件工程师指南

一、简介 人工智能这个主题激发了我的兴趣,我一直在这个领域中不断学习和尝试新事物。 众所周知,与自然语言处理、计算机视觉等相关的技术已经出现并发展成为每天被数百万用户使用的解决方案。 尽管人们使用“人工智能”这一术语,但我们离…

[计算机网络]---网络编程套接字

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、基础知识…

C++ //练习 6.7 编写一个函数,当它第一次被调用时返回0,以后每次被调用返回值加1。

C Primer(第5版) 练习 6.7 练习 6.7 编写一个函数,当它第一次被调用时返回0,以后每次被调用返回值加1。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /**********************…

如何将字体添加到 ONLYOFFICE 文档服务器 8.0

作者:VincentYoung 阅读本文,了解如何为自己的在线办公软件 ONLYOFFICE 文档服务器的字体库添加字体 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器,支持处理文本文档、电子表格、演示文稿、可填写表单、PDF 和电子书…

无人机竞赛视觉算法开发流程开源计划(询问大家意见)

本科中参加过一系列的无人机机器人竞赛,像电赛、工训赛、机器人大赛这些,有一些比较常用的方案打算开源一下。现在读研了,也算是对本科的一个总结,但是还是想看看大家意见,大家有什么需求可以在评论区说,我…

EsayExcel文件导入导出

目录 准备工作 监听器类 导入测试 导出测试 上传Excel 下载Excel 混合导出模板导出 headRowNumber(1)&#xff1a;从第几行开始读 准备工作 导入依赖 <!--easyexcel--> <dependency><groupId>com.alibaba</groupId>x<artifactId>easye…

QTabWidget和QTabBar控件样式设置(qss)

QTabWidget和QTabBar控件样式设置 1、QTabWidget样式可自定义的有哪些示例&#xff1a;效果图 2、QTabBar样式可自定义的有哪些示例效果图 1、QTabWidget样式可自定义的有哪些 QTabWidget::pane{} 定义tabWidgetFrameQTabWidget::tab-bar{} 定义TabBar的位置QTabWidget::tab{}定…

简单的手指控制机械臂

跟之前的那个项目类似, 使用mediapipe, 拿到手指的位置, 来控制舵机, 从而控制一个机械臂. 直接上代码: """ 演示一个简单的虚拟拖拽 步骤&#xff1a; 1、opencv 读取视频流"""# 导入opencv import cv2 import numpy as np import math impor…

c++STL系列——(八)multiset

在C的标准模板库&#xff08;STL&#xff09;中&#xff0c;multiset是一个非常有用的容器&#xff0c;和set容器类似&#xff0c;用于存储一组按照特定顺序排列的元素。与set不同的是&#xff0c;multiset允许重复元素的存在。本文将详细介绍multiset容器的特点、用法以及一些…

基于物联网的实时数据分析(简单介绍)

在当今这个信息化、数字化飞速发展的时代&#xff0c;物联网&#xff08;Internet of Things, IoT&#xff09;和实时数据分析成为了技术革新的两大支柱。对于刚入行的新手来说&#xff0c;理解这两个概念及其相互作用不仅是迈入这一领域的第一步&#xff0c;更是掌握未来技术趋…

Acwing---842.排列数字

排列数字 1.题目2.基本思想3.代码实现 1.题目 给定一个整数 n&#xff0c;将数字 1∼n排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;请你按照字典序将所有的排列方法输出。 输入格式 共一行&#xff0c;包含一个整数 n。 输出格式 按字典序输出所有排列方案…

React报错修复:“Uncaught TypeError: destroy is not a function”

报错&#xff1a;Uncaught TypeError: destroy is not a function at commitHookEffectListUnmount 如果你在useEffect函数中使用了async&#xff0c;运行后会出现该报错。 原理解析&#xff1a;     要知道&#xff0c;useEffect 钩子函数的一个特性是清理功能&#xff0c;…

OJ_求最大公约数和最大公倍数

欧几里得算法&#xff08;辗转相除法&#xff09;求最大公约数 这个算法的原理基于以下定理&#xff1a;两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数 #include <stdio.h> // Greatest Common Divisor&#xff0c;简称GCD #define _CRT_SECURE_N…

flask+python儿童福利院管理系统pycharm毕业设计项目

本系统解决了儿童福利院管理事务中的主要问题&#xff0c;包括首页、个人中心、爱心人士管理、员工管理、后勤人员管理、儿童信息管理、院所风采管理、活动管理、食谱管理、领养流程管理、政策法规管理、楼栋管理、宿舍管理、领养申请管理、义工申请管理、捐赠信息管理、宿舍物…

理解SMTP与IMAP协议:Python中的邮件发送与接收

源码分享 ​​https://docs.qq.com/sheet/DUHNQdlRUVUp5Vll2?tabBB08J2​​ 电子邮件是当代通信的一个重要工具。它涉及到多种协议&#xff0c;其中SMTP和IMAP是最关键的。本文将详细介绍这两个协议&#xff0c;并提供Python代码示例&#xff0c;帮助你理解如何在Python中实…

CTFshow web(php命令执行59-67)

web59 <?php /* # -*- coding: utf-8 -*- # Author: Lazzaro # Date: 2020-09-05 20:49:30 # Last Modified by: h1xa # Last Modified time: 2020-09-07 22:02:47 # email: h1xactfer.com # link: https://ctfer.com */ // 你们在炫技吗&#xff1f; if(isset($_POST…