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-04 01:03:18 +08:00
|
|
|
[#]: reviewer: " "
|
|
|
|
[#]: publisher: " "
|
|
|
|
[#]: url: " "
|
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
Lua值得学习吗?
|
2022-11-04 01:03:18 +08:00
|
|
|
======
|
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
Lua是一个有趣且强大的语言, 随着版本的推进, 功能愈发的强大, 开发者也在不断的增长. 这篇文章我们将探索一下它的可能性.
|
2022-11-04 01:03:18 +08:00
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
Lua是一个脚本语言, 它面向过程, 函数式编程, 甚至可以是[面向对象的][1]. 它使用类c的语法, 但却是动态类型, 具有自动内存管理和垃圾回收功能, 使用基于寄存器的虚拟机来解释字节码. 这些特点使得它对于初学者来说是个很好的语言, 同时也是经验丰富的程序员的强大工具.
|
2022-11-04 01:03:18 +08:00
|
|
|
|
2022-11-10 11:26:21 +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-10 11:32:26 +08:00
|
|
|
就像其他任何事情一样, 做到完美是需要时间的, Lua是很易于学习(并且有趣)的语言. 它是一种一致性的语言, 一种带有有用的错误消息的友好的语言, 并且可以在网上轻松找到许多有用的资料. 那么就让我们开始吧!
|
2022-11-04 01:03:18 +08:00
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
### 安装Lua
|
2022-11-04 01:03:18 +08:00
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
在Linux下, 你可以使用发行版自带的包管理来安装Lua. 例如, 在Fedora, CentOS, Mageia, OpenMandriva以及相似的发行版中:
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
```
|
|
|
|
$ sudo dnf install lua
|
|
|
|
```
|
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
在Debian以及基于Debian的系统中:
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
```
|
|
|
|
$ sudo apt install lua
|
|
|
|
```
|
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
对于Mac, 你可以使用[MacPorts][5] 或者 [Homebrew][6].
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
```
|
|
|
|
$ sudo port install lua
|
|
|
|
```
|
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
对于Windows, 可以使用[Chocolatey][7]安装Lua.
|
2022-11-04 01:03:18 +08:00
|
|
|
|
2022-11-10 11:26:21 +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-10 11:26:21 +08:00
|
|
|
如许多编程语言一样, Lua调用一个内建的函数或关键字, 后面跟着参数. 例如, `print`函数显示你传给它的所有参数.
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
```
|
|
|
|
$ lua
|
|
|
|
Lua 5.4.2 Copyright (C) 1994-2020 Lua.org, PUC-Rio
|
|
|
|
|
|
|
|
> print('hello')
|
|
|
|
hello
|
|
|
|
```
|
|
|
|
|
2022-11-10 11:26:21 +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-10 11:26:21 +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-10 11:26:21 +08:00
|
|
|
在编程中, 数组的使用频率仅次于变量的存在. "数组"这个词的字面意思就是一种排列, 而这就是程序中数组的意义了. 它是数据的一种排列, 因为有排列, 所有数组具有结构化的优势. 本只上数组通常用于和变量相同的目的, 只不过数组会给对其中的数据进行排序. 在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
|
|
|
|
|
|
|
```
|
|
|
|
> mytable = {}
|
|
|
|
```
|
|
|
|
|
2022-11-10 11:26:21 +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-10 11:26:21 +08:00
|
|
|
### 使用Lua作为脚本
|
2022-11-04 01:03:18 +08:00
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
在终端交互环境中运行Lua可以得到良好的反馈, 但是将Lua作为脚本运行会更为有用. 一个Lua脚本就是包含Lua代码的文本文件, Lua命令可以解析并执行此文件.
|
2022-11-04 01:03:18 +08:00
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
对于开始学习一门编程语言, 永恒的问题是你怎么知道该写什么. 这篇文章将提供一个不错的开端, 截至目前, 你仅知道了两三个Lua函数. 懂得查阅文档是很关键的. Lua并不是一个复杂的语言, 可以通过[Lua文档网站][8]很方便的获取关键字以及函数的用法.
|
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-10 11:26:21 +08:00
|
|
|
假设你想编写一个Lua脚本来统计句子中的单词数量. 与众多的编程挑战一样, 有许多方法可以解决这个问题, 假设你在Lua文档中找到的第一个相关的函数是`string.gmatch`, 此函数可以搜索字符串中的特定字符. 单词通常通过空格分隔开来, 所以你决定计算空格数并加1来作为单词的数量.
|
2022-11-04 01:03:18 +08:00
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
下面是实现的代码
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
```
|
|
|
|
function wc(words,delimiter)
|
|
|
|
count=1
|
|
|
|
for w in string.gmatch(words, delimiter) do
|
|
|
|
count = count + 1
|
|
|
|
end
|
|
|
|
|
|
|
|
return count
|
|
|
|
end
|
|
|
|
```
|
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
下面是这个样例代码的解释
|
2022-11-04 01:03:18 +08:00
|
|
|
|
2022-11-10 11:26:21 +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-10 11:26:21 +08:00
|
|
|
现在你已经创建了一个函数, 你可以使用它. 需要记住, 函数不会自动运行, 而是等待你在代码中调用它.
|
2022-11-04 01:03:18 +08:00
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
将下面的代码写入文件并保存为`words.lua`
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
```
|
|
|
|
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)
|
|
|
|
```
|
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
你现在创建了一个Lua脚本. 你可以使用Lua运行它. 随后你会发现统计单词的结果有些问题
|
2022-11-04 01:03:18 +08:00
|
|
|
|
|
|
|
```
|
|
|
|
$ lua ./words.lua
|
|
|
|
2
|
|
|
|
3
|
|
|
|
6
|
|
|
|
```
|
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
你也许已经注意到了最后一个句子的单词统计不正确, 因为在句子的最后带有一个额外的空格. Lua正确的检测到了空格, 并将其计入`count`中, 但是单子的统计是错误的, 因为有个空格并没有作为单词的分隔出现. 我把这个问题留给你来解决, 或者去发现其他方法, 即使这个方法不太理想. 编程中有很多需要思考的地方. 有时是纯粹学术性的思考, 有时也许是应用是否运训正常的思考.
|
2022-11-04 01:03:18 +08:00
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
### 学习Lua
|
2022-11-04 01:03:18 +08:00
|
|
|
|
2022-11-10 11:26:21 +08:00
|
|
|
Lua是一个有趣且强大的语言, 随着版本的推进, 功能愈发的强大, 开发者也在不断的增长. 你可以将Lua作为实用性的个人脚本使用, 或者在工作中使用, 或者仅仅是体验一下一个新的语言. 尝试一下, 看看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-04 01:03:18 +08:00
|
|
|
校对:[校对者ID](https://github.com/校对者ID)
|
|
|
|
|
|
|
|
本文由 [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
|