Lua 值得学习吗?

Lua 是一种有趣且健壮的语言,每次发布都会进行渐进式改进,并且拥有不断壮大的开发者群体。 探索它的所有可能性。
4 位读者喜欢这篇文章。
Woman sitting in front of her computer

Ray Smith

Lua 是一种脚本语言,用于过程式编程、函数式编程,甚至 面向对象编程。 它使用类似 C 的语法,但它是动态类型的,具有自动内存管理和垃圾回收功能,并通过使用基于寄存器的虚拟机解释字节码来运行。 这使其成为初学者的绝佳语言,也是经验丰富的程序员的强大工具。

Lua 在公众视野中已被 PythonJavaScript 等语言在一定程度上掩盖,但 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,您可以使用 MacPortsHomebrew

$ 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:声明函数开始的关键字。 自定义函数的工作方式与内置函数(如 printstring.len)基本相同。

  • wordsdelimiter:函数运行所需的参数。 在语句 print('hello') 中,单词 hello 是一个参数。

  • counter:设置为 1 的变量。

  • for:一个循环,使用 string.gmatch 函数迭代您输入到函数中的 words,并搜索您输入的 delimiter

  • count = count +1:对于找到的每个 delimitercount 的值都会重新设置为其当前值加 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 能带来什么。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和《龙与地下城》爱好者。 他曾在电影和计算机行业工作,而且经常同时进行。

1 条评论

精彩的报道,Seth!

清晰、简洁、明了,恰到好处的处理方式,传达了 Lua 语法、简单性和激起兴趣的要点。

我将在 #Fediverse 中发布这篇文章的链接,它应该会受到欢迎,所以期待一些来自那里的访客!

.

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.