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
还有 FizzBuzz:
代码语言: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 = "