Lua 是一种脚本语言,用于过程式编程、函数式编程,甚至 面向对象编程。 它使用类似 C 的语法,但它是动态类型的,具有自动内存管理和垃圾回收功能,并通过使用基于寄存器的虚拟机解释字节码来运行。 这使其成为初学者的绝佳语言,也是经验丰富的程序员的强大工具。
Lua 在公众视野中已被 Python 和 JavaScript 等语言在一定程度上掩盖,但 Lua 具有一些优势,使其在一些主要的软件项目中很受欢迎。 Lua 可以轻松地嵌入到其他语言中,这意味着您可以将 Lua 文件包含在用(例如)Java 编写的代码库中,并且它可以像本机 Java 代码一样运行。 这听起来像魔法,但当然有像 luaj 这样的项目正在努力使其成为可能,而这仅仅是因为 Lua 就是为此而设计的。 部分原因是由于这种灵活性,您很可能会发现 Lua 是视频游戏、图形应用程序等的脚本语言。
与任何事物一样,精通需要时间,但 Lua 易于(且有趣)学习。 它是一种一致的语言,一种友好的语言,具有有用的错误消息,并且在线有很多很棒的支持。 准备好开始了吗?
安装 Lua
在 Linux 上,您可以使用发行版的软件包管理器安装 Lua。 例如,在 Fedora、CentOS、Mageia、OpenMandriva 和类似的发行版上
$ sudo dnf install lua
在 Debian 和基于 Debian 的系统上
$ sudo apt install lua
对于 Mac,您可以使用 MacPorts 或 Homebrew。
$ sudo port install lua
对于 Windows,请使用 Chocolatey 安装 Lua。
要在交互式解释器中测试 Lua,请在终端中键入 lua
。
函数
与许多编程语言一样,Lua 语法通常涉及内置函数或关键字,后跟一个参数。 例如,print
函数显示您提供给它的任何参数。
$ lua
Lua 5.4.2 Copyright (C) 1994-2020 Lua.org, PUC-Rio
> print('hello')
hello
Lua 的 string
库可以操作单词(在编程中称为“字符串”)。 例如,要计算字符串中的字母数,您可以使用 string
库的 len
函数
> string.len('hello')
5
变量
变量允许您在计算机内存中创建一个特殊位置来存储临时数据。 您可以通过发明变量名称,然后将一些数据放入其中来在 Lua 中创建变量。
> foo = "hello world"
> print(foo)
hello world
> bar = 1+2
> print(bar)
3
表
在编程中,仅次于变量流行的就是数组。 “数组”一词的字面意思是排列,而这正是编程数组的全部意义。 它是一种特定的数据排列,并且由于存在排列,因此数组具有结构化的优势。 数组通常用于执行与变量基本相同的目的,不同之处在于数组可以对其数据强制执行顺序。 在 Lua 中,数组称为 table
。
创建表就像创建变量一样,不同之处在于您将其初始内容设置为两个大括号 ({}
)
> mytable = {}
当您向表中添加数据时,它也很像创建变量,不同之处在于您的变量名始终以表名开头,并用点分隔
> mytable.foo = "hello world"
> mytable.bar = 1+2
> print(mytable.foo)
hello world
> print(mytable.bar)
3
使用 Lua 编写脚本
在终端中运行 Lua 非常适合获得即时反馈,但将 Lua 作为脚本运行更有用。 Lua 脚本只是一个包含 Lua 代码的文本文件,Lua 命令可以解释和执行该代码。
刚开始学习编程语言时,永恒的问题是你应该如何知道要写什么。 本文提供了一个良好的开端,但到目前为止,您只知道两三个 Lua 函数。 当然,关键在于文档。 Lua 语言并不那么复杂,参考 Lua 文档站点 获取关键字和函数列表是非常合理的。
这是一个练习题。
假设您想编写一个 Lua 脚本来计算句子中的单词数。 与许多编程挑战一样,有很多方法可以解决这个问题,但假设您在 Lua 文档中找到的第一个相关函数是 string.gmatch
,它可以搜索字符串中的特定字符。 单词通常用空格分隔,因此您认为计算空格数 + 1 应该可以合理准确地计算出它们分隔的单词数。
这是该函数的代码
function wc(words,delimiter)
count=1
for w in string.gmatch(words, delimiter) do
count = count + 1
end
return count
end
以下是该示例代码的组成部分
-
function
:声明函数开始的关键字。 自定义函数的工作方式与内置函数(如print
和string.len
)基本相同。 -
words
和delimiter
:函数运行所需的参数。 在语句print('hello')
中,单词hello
是一个参数。 -
counter
:设置为 1 的变量。 -
for
:一个循环,使用string.gmatch
函数迭代您输入到函数中的words
,并搜索您输入的delimiter
。 -
count = count +1
:对于找到的每个delimiter
,count
的值都会重新设置为其当前值加 1。 -
end
:结束for
循环的关键字。 -
return count
:此函数输出(或返回)count
变量的内容。 -
end
:结束函数的关键字。
现在您已经创建了自己的函数,您可以使用它了。 这是关于函数需要记住的重要事项。 它不会自行运行。 它等待您在代码中调用它。
将此示例代码键入文本文件并将其另存为 words.lua
function wc(words,delimiter)
count=1
for w in string.gmatch(words, delimiter) do
count = count + 1
end
return count
end
result = wc('zombie apocalypse', ' ')
print(result)
result = wc('ice cream sandwich', ' ')
print(result)
result = wc('can you find the bug? ', ' ')
print(result)
您刚刚创建了一个 Lua 脚本。 您可以使用 Lua 运行它。 您能找到这种单词计数方法的问题吗?
$ lua ./words.lua
2
3
6
您可能会注意到,对于最后一个短语,计数不正确,因为参数中有一个尾随空格。 Lua 正确检测到空格并将其计入 count
,但单词计数不正确,因为该特定空格恰好不分隔单词。 我将解决该问题或找到此方法不理想的其他方法留给您。 编程中有很多思考。 有时它纯粹是学术性的,有时它关系到应用程序是否完全可以工作。
学习 Lua
Lua 是一种有趣且健壮的语言,每次发布都会进行渐进式改进,并且拥有不断壮大的开发者群体。 您可以将 Lua 用作个人脚本的实用语言,或用于提升您的职业生涯,或仅作为学习新语言的实验。 试一试,看看 Lua 能带来什么。
1 条评论