前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【100 种语言速成】第 4 节:Lua

【100 种语言速成】第 4 节:Lua

作者头像
海拥
发布2022-04-13 17:20:19
4150
发布2022-04-13 17:20:19
举报
文章被收录于专栏:全栈技术全栈技术

Lua 是一种来自巴西的小型编程语言,并且是唯一来自巴西并在全球产生重大影响的技术。

Lua 与其他语言的主要区别在于它非常适合嵌入到现有应用程序中,并且在视频游戏中特别受欢迎(这里只是部分列表)。

原则上,您可以为任何现有语言(如 Tcl、Python、JavaScript 或任何其他您喜欢的语言)嵌入几乎任何虚拟机。这往往比嵌入 Lua 复杂得多。如今,JavaScript 越来越多地将 Lua 排除在其主要利基之外,但如果你想从事游戏开发或改装,一些基本的 Lua 仍然是一项有用的技能。当我们探索 Lua 时,您可能会发现它失去人气的几个原因。

Hello, world!

这段代码可能跟大多数语言相同:

代码语言:javascript
复制
print("Hello, World!")

下面是斐波那契,除了for 注释和范围循环语法之外看起来并不太奇怪:

代码语言:javascript
复制
-- Fibonacci function
function fib(n)
  if n < 3 then
    return 1
  else
    return fib(n - 1) + fib(n - 2)
  end
end

for i = 1,30 do
  print(fib(i))
end

还有 FizzBu​​zz:

代码语言:javascript
复制
function fizzbuzz(n)
  if n % 15 == 0 then
    return "FizzBuzz"
  elseif n % 5 == 0 then
    return "Buzz"
  elseif n % 3 == 0 then
    return "Fizz"
  else
    return n
  end
end

for i = 1,100 do
  print(fizzbuzz(i))
end

Lua 有一个称为“表”的数据结构,它既可以用作数组/列表,也可以用作字典/散列/对象。

让我们看看它是如何工作的:

代码语言:javascript
复制
local x = {"foo", "bar"}
local y = {"foo", "bar"}

print(x)
print(y)
print(x == y)

我们天真地期望:

代码语言:javascript
复制
{"foo", "bar"}
{"foo", "bar"}
true

然而,我们得到的是:

代码语言:javascript
复制
table: 0x7fb9cee04080
table: 0x7fb9cee040e0
false

这是正确的! Lua 在复杂类型上没有相等性(JavaScript 共享相同的缺陷),它甚至没有内置的 console.log。

让我们编写自己的检查

编写我们自己的检查并不太难。它并不令人惊奇,不做任何漂亮的打印,如果数据链接到自身,它可能会陷入无限循环,等等,但它现在应该服务于我们的目的。

代码语言:javascript
复制
function inspect(value)
  if type(value) == "table" then
    local result = ""
    for k, v in pairs(value) do
      if result ~= "" then
        result = result .. ", "
      end
      result = result .. tostring(k) .. "=" .. inspect(v)
    end
    return "{" .. result .. "}"
  else
    return tostring(value)
  end
end

local x = {"foo", "bar"}
local y = {name="Bob", surname="Ross", age=52}

print(inspect(x))
print(inspect(y))

这让我们:

代码语言:javascript
复制
{1=foo, 2=bar}
{age=52, name=Bob, surname=Ross}

我们学到了什么?

  • type(value)返回我们传递的任何内容的类型 - 这"table"适用于大多数复杂类型
  • 字符串可以与 连接…,没有字符串插值
  • !=拼写~=
  • 不保留表中键的顺序
  • 数组编号从 1 开始!

最后一个可能有点震惊。过去,编程语言分为基于 0 的索引和基于 1 的索引。Lua 大约是这些时代的最后一个残余,基于 0 的索引已经获胜。

顺便说一句,Perl 有趣的是$[,它是一个特殊的变量确定数组索引,你可以将它设置为 42 来关心它。他们在某个时候删除了此功能。它实际上并非完全疯狂,它旨在帮助将 awk 脚本移植到 Perl。也许我会在某个时候谈到那个故事。

统一码

让我们看看 Lua 如何处理 Unicode:

代码语言:javascript
复制
a = "Hello"
b = "Żółw"
c = "💩"

print(a:lower())
print(b:upper())
print(#a)
print(#b)
print(#c)

事实证明,非常糟糕:

代码语言:javascript
复制
hello
ŻółW
5
7
4

不幸的是:lower(),:upper()对Unicode一无所知,并#返回字节数,而不是字符串的长度(string.len(a)就像#a,返回字节数)。

你应该使用Lua吗?

老实说,对于新程序,不是真的,但是如果您对游戏开发感兴趣,仍然值得了解基础知识。它仍然在游戏脚本中占有重要地位。正如您所看到的,即使做非常简单的事情,由于语言的弱点,我们也会遇到问题。

Lua 似乎也存在社区碎片化的重大问题。高性能 LuaJIT 实现仅支持相当旧的 Lua 5.1 版本,而主要语言已经转移到 5.3。由于 Lua 代码往往嵌入到某些引擎(通常是游戏引擎)中,因此很多代码依赖于引擎提供的各种功能,不会在其他地方运行。LuaRocks 有 3000 个包,与 13 万个 ruby​​ gem 或 130 万个 npm 包相比,这是微不足道的,即使所有的岩石都运行在每个 Lua 上,但它们没有。

现在 Lua 看起来像是一种即将被淘汰的语言,但事情仍有可能好转。与大多数其他软件不同 - 视频游戏在发布几十年后就开始使用,并且它们的 Lua 代码也随之而来。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/03/18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hello, world!
      • 让我们编写自己的检查
        • 统一码
          • 你应该使用Lua吗?
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档