2022-11-04 01:03:18 +08:00
|
|
|
|
[#]: subject: "Is Lua worth learning?"
|
|
|
|
|
[#]: via: "https://opensource.com/article/22/11/lua-worth-learning"
|
|
|
|
|
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
|
|
|
|
[#]: collector: "lkxed"
|
2022-11-10 11:26:21 +08:00
|
|
|
|
[#]: translator: "MuggleWei"
|
2022-11-12 11:21:12 +08:00
|
|
|
|
[#]: reviewer: "wxy"
|
2022-11-12 11:22:14 +08:00
|
|
|
|
[#]: publisher: "wxy"
|
|
|
|
|
[#]: url: "https://linux.cn/article-15243-1.html"
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
Lua 值得学习吗?
|
2022-11-04 01:03:18 +08:00
|
|
|
|
======
|
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
![](https://img.linux.net.cn/data/attachment/album/202211/12/111937y0kior1oyf44tttt.jpg)
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
> Lua 是一个有趣而强大的语言,随着各个版本的推进,功能愈发的强大,开发者群体也在不断的增长。这篇文章我们将探索一下它的各种前景。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
Lua 是一个脚本语言,它面向过程、函数式编程,甚至可以是 [面向对象的][1]。它使用类 C 语言的语法,但却是动态类型,具有自动内存管理和垃圾回收功能,使用基于寄存器的虚拟机来解释字节码。这些特点使得它对于初学者来说是个很好的语言,同时也是经验丰富的程序员的强大工具。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
虽然与 [Python][2] 和 [JavaScript][3] 相比,Lua 现在已经有点儿黯然失色了,但是 Lua 拥有的一些优点使得它在许多的重大软件项目中很受欢迎。Lua 很容易嵌入到其他语言当中, 这意味着你可以在(例如)Java 编写的代码中包含 Lua 文件,就像原生的 Java 代码一样运行。这听起来就像魔法一般,现在有许多项目如 [luaj][4] 使得其成为可能,之所以可以实现,正是因为 Lua 就是为此而设计的。部分出于这种灵活性,你可以在许多游戏、图形应用的程序中发现 Lua 脚本的身影。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
就像其他任何事情一样,做到完美是需要时间的,但 Lua 是很易于学习(并且有趣)的语言。它是一种一致的语言、一种带有有用的错误消息的友好的语言,并且可以在网上轻松找到许多有用的资料。那么就让我们开始吧!
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
### 安装 Lua
|
|
|
|
|
|
|
|
|
|
在 Linux 下,你可以使用发行版自带的包管理来安装 Lua。例如,在 Fedora、CentOS、 Mageia、OpenMandriva 以及类似发行版中:
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ sudo dnf install lua
|
|
|
|
|
```
|
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
在 Debian 以及基于 Debian 的系统中:
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ sudo apt install lua
|
|
|
|
|
```
|
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
对于 Mac,你可以使用 [MacPorts][5] 或者 [Homebrew][6]:
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ sudo port install lua
|
|
|
|
|
```
|
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
对于 Windows,可以使用 [Chocolatey][7] 安装 Lua。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
完成安装后,可以在终端中输入 `lua` 来在交互式解释器中使用 Lua。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
|
### 函数
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
如许多编程语言一样,Lua 的语法通常是一个内建的函数或关键字,后面跟着参数。例如,`print` 函数显示你传给它的所有参数。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ lua
|
2022-11-12 11:21:12 +08:00
|
|
|
|
Lua 5.4.2 Copyright (C) 1994-2020 Lua.org,PUC-Rio
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
> print('hello')
|
|
|
|
|
hello
|
|
|
|
|
```
|
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
Lua 的 `string` 库可以操作单词(在编程中称为“字符串”)。例如,要统计字符串中的字母数量,你可以使用 `string` 库中 `len` 函数:
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
> string.len('hello')
|
|
|
|
|
5
|
|
|
|
|
```
|
|
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
|
### 变量
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
变量允许你在计算机内存中为临时的数据创建一个指定的空间。Lua 中创建变量的方法是赋予变量一个名字,接着将数据放入其中。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
> foo = "hello world"
|
|
|
|
|
> print(foo)
|
|
|
|
|
hello world
|
|
|
|
|
> bar = 1+2
|
|
|
|
|
> print(bar)
|
|
|
|
|
3
|
|
|
|
|
```
|
|
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
|
### 表
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
在编程中,数组的使用频率仅次于变量。“数组”这个词的字面意思就是一种排列,而这就是程序中数组的意义了。它是数据的一种排列,因为有排列,所有数组具有结构化的优势。本质上,数组通常用于和变量相同的目的,只不过数组会给对其中的数据进行排序。在 Lua 中,数组被称为“表”。(LCTT 译注:使用过其它编程语言的同学可以发现,Lua 的表相当于其它语言中的关联数组、哈希。)
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
创建表和创建变量类似,区别仅在于它的初始化内容被设置为 `{}`:
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
> mytable = {}
|
|
|
|
|
```
|
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
当往表中增加数据时,它就如同创建变量一样,区别在于这里的变量之前总是以表名开头,中间使用 `.` 来连接:
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
> mytable.foo = "hello world"
|
|
|
|
|
> mytable.bar = 1+2
|
|
|
|
|
> print(mytable.foo)
|
|
|
|
|
hello world
|
|
|
|
|
> print(mytable.bar)
|
|
|
|
|
3
|
|
|
|
|
```
|
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
### 使用 Lua 编写脚本
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
在终端交互环境中运行 Lua 可以得到良好的反馈,但是将 Lua 作为脚本运行会更为有用。Lua 脚本就是包含 Lua 代码的文本文件,Lua 命令可以解析并执行此文件。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
在刚刚开始学习一门编程语言时,一个永恒的问题是你怎么知道该写什么。这篇文章将提供一个不错的开端,截至目前,你仅知道了两三个 Lua 函数。懂得查阅文档是很关键的。Lua 并不是一个复杂的语言,可以通过 [Lua 文档网站][8] 很方便的获取关键字以及函数的用法。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
下面是一个练习题。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
假设你想编写一个 Lua 脚本来统计句子中的单词数量。与众多的编程挑战一样,有许多方法可以解决这个问题,假设你在 Lua 文档中找到的第一个相关的函数是 `string.gmatch`,此函数可以搜索字符串中的特定字符。单词通常通过空格分隔开来,所以你决定计算空格数并加 1 来作为单词的数量。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
下面是实现的代码:
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
function wc(words,delimiter)
|
|
|
|
|
count=1
|
2022-11-12 11:21:12 +08:00
|
|
|
|
for w in string.gmatch(words,delimiter) do
|
2022-11-04 01:03:18 +08:00
|
|
|
|
count = count + 1
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return count
|
|
|
|
|
end
|
|
|
|
|
```
|
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
下面是这个样例代码的解释:
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
- `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`:函数结束的关键字。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
现在你已经创建了一个函数,你可以使用它。需要记住,函数不会自动运行,而是等待你在代码中调用它。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
将下面的代码写入文件并保存为 `words.lua`:
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
function wc(words,delimiter)
|
|
|
|
|
count=1
|
2022-11-12 11:21:12 +08:00
|
|
|
|
for w in string.gmatch(words,delimiter) do
|
2022-11-04 01:03:18 +08:00
|
|
|
|
count = count + 1
|
|
|
|
|
end
|
|
|
|
|
return count
|
|
|
|
|
end
|
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
result = wc('zombie apocalypse',' ')
|
2022-11-04 01:03:18 +08:00
|
|
|
|
print(result)
|
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
result = wc('ice cream sandwich',' ')
|
2022-11-04 01:03:18 +08:00
|
|
|
|
print(result)
|
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
result = wc('can you find the bug? ',' ')
|
2022-11-04 01:03:18 +08:00
|
|
|
|
print(result)
|
|
|
|
|
```
|
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
你现在创建了一个 Lua 脚本。你可以使用 Lua 运行它。随后你会发现统计单词的结果有些问题:
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
$ lua ./words.lua
|
|
|
|
|
2
|
|
|
|
|
3
|
|
|
|
|
6
|
|
|
|
|
```
|
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
你也许已经注意到了最后一个句子的单词统计不正确,因为在句子的最后带有一个额外的空格。Lua正确的检测到了空格,并将其计入 `count` 中,但是单子的统计是错误的,因为有个空格并没有作为单词的分隔出现。我把这个问题留给你来解决,或者去发现其他方法,即使方法不太理想。编程中有很多需要思考的地方。有时是纯粹学术性的思考,有时也许是应用是否运训正常的思考。
|
|
|
|
|
|
|
|
|
|
### 学习 Lua
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
Lua 是一个有趣且强大的语言,随着版本的推进,功能愈发的强大,开发者群体也在不断的增长。你可以将 Lua 作为实用性的个人脚本使用,或者在工作中使用,或者仅仅是体验一下一个新的语言。尝试一下,看看 Lua 能给你带来什么吧。
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
2022-11-12 11:21:12 +08:00
|
|
|
|
(LCTT 译注:顺便问一句,你知道 “Lua” 怎么发音吗? 🤣)
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
via: https://opensource.com/article/22/11/lua-worth-learning
|
|
|
|
|
|
|
|
|
|
作者:[Seth Kenlon][a]
|
|
|
|
|
选题:[lkxed][b]
|
2022-11-10 11:26:21 +08:00
|
|
|
|
译者:[MuggleWei](https://github.com/MuggleWei)
|
2022-11-12 11:21:12 +08:00
|
|
|
|
校对:[wxy](https://github.com/wxy)
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
|
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
|
|
|
|
|
|
|
|
|
[a]: https://opensource.com/users/seth
|
|
|
|
|
[b]: https://github.com/lkxed
|
|
|
|
|
[1]: https://opensource.com/article/22/10/object-oriented-lua%20
|
|
|
|
|
[2]: https://opensource.com/resources/python
|
|
|
|
|
[3]: https://opensource.com/article/22/9/javascript-glossary
|
|
|
|
|
[4]: https://github.com/luaj/luaj
|
|
|
|
|
[5]: https://opensource.com/article/20/11/macports
|
|
|
|
|
[6]: https://opensource.com/article/20/6/homebrew-linux
|
|
|
|
|
[7]: https://opensource.com/article/20/3/chocolatey
|
|
|
|
|
[8]: http://www.lua.org/docs.html
|