初学者指南
这篇文章适用于那些对 Lua 完全不熟悉但想立刻开始学习 Pluto 的人。
对于已经熟悉 Lua 的人来说,本文档的其余部分应该是 Pluto 的很好介绍。
你的第一个程序
让我们从简单的 “Hello, world!” 开始。
print("Hello, world!")
试一试
建议使用 "试一试" 链接进行尝试。同时,你可以随意修改代码并使用终端重新运行它(上箭头键 + 回车键)。
正如你所看到的,这个程序打印 "Hello, world!",它通过调用 Lua 的内置 print 函数来实现。
简单的计算
当然,我们希望的不仅仅是输出一个文本,所以让我们通过一些算术运算来变得更加编程化。
print($"2 + 2 is {2 + 2}")
请注意字符串前面的 $;这允许我们使用大括号将表达式直接嵌入到字符串中。在这种情况下,我们嵌入了表达式 2 + 2,它的值是 4。
试一试
变量
在 Lua/Pluto 中,默认情况下变量是全局的,可以简单地分配:
a = 2
print($"a is {a}")
a += 2
print($"I added 2 and now it's {a}")
请注意,字符串前面仍然有 $,但这次我们嵌入了表达式 a,它在这里访问了 a 的值。
试一试
条件语句
然而,编程不仅仅是关于计算,所以让我们进入流程控制,或者正如计算机科学家所称的 “控制流”("control flow")。
a = 1
b = 2
if a + b == 4 then
print("The sum is 4!")
else
print("The sum is not 4. Could you change a or b to fix it?")
end
试一试
如你所见,打印的消息会根据表达式 a + b == 4 是否为 true 或 false 而发生变化。
循环
我们不仅可以改变代码是否运行,还可以改变运行的频率。例如,我们可以创建一个从1数到10的脚本:
for i=1, 10 do
print(i)
end
试一试
我们还可以更改间隔。例如,在间隔为10的情况下从0数到100:
for i=0, 100, 10 do
print(i)
end
试一试
表
好的,现在你了解了基本的控制流和数据类型(数字和字符串),让我们来看一个更有趣的数据类型:表(tables)。它可以存储有组织的多个数据,例如游戏中每个玩家的分数:
players = {
["John"] = 15,
["Jane"] = 10,
["Bob"] = 12,
}
for name, score in players do
print($"{name} has a score of {score}.")
end
试一试
请注意,我们仍然使用了一个 for 循环,但这次我们是在我们的玩家表上进行 迭代,而不是在一系列数字上。
我们还可以在表中存储表,因此我们可以为每个玩家存储更多数据,而不仅仅是一个单独的数字:
players = {
["John"] = {
["kills"] = 15,
["deaths"] = 5,
},
["Jane"] = {
["kills"] = 10,
["deaths"] = 8,
},
["Bob"] = {
["kills"] = 12,
["deaths"] = 8,
},
}
for name, data in players do
print($"{name} has {data.kills} kills and {data.deaths} deaths.")
end
试一试
计算 K/D 比
让我们把到目前为止学到的东西都付诸实践,创建一个真正为我们工作的程序,而不是那些简单的例子。
players = {
["John"] = {
["kills"] = 15,
["deaths"] = 5,
},
["Jane"] = {
["kills"] = 10,
["deaths"] = 8,
},
["Bob"] = {
["kills"] = 12,
["deaths"] = 8,
},
}
-- Add "kd" field to each player
for players as player do
player.kd = player.kills / player.deaths
end
-- Print
for name, data in players do
print($"{name} has a K/D of {data.kd}.")
end
试一试
请注意另一种 for 循环的变体:for-as 循环。这对于计算 K/D 比很方便,因为我们不关心玩家的名字。
函数中的封装
我们已经使用了不少函数,,,好吧,至少有 print 函数,所以现在是时候创建我们自己的函数了。
function calculate_kd(plys: table)
for plys as ply do
ply.kd = ply.kills / ply.deaths
end
end
players = {
["John"] = {
["kills"] = 15,
["deaths"] = 5,
},
["Jane"] = {
["kills"] = 10,
["deaths"] = 8,
},
["Bob"] = {
["kills"] = 12,
["deaths"] = 8,
},
}
calculate_kd(players)
for name, data in players do
print($"{name} has a K/D of {data.kd}.")
end
试一试
正如你所看到的,代码的行为与以前完全相同!也许不是非常有趣,但比起另一种选择要好。
让我们详细分析一下到底发生了什么:
- 在第一行,我们声明了一个名为
calculate_kd的函数,它有一个类型为table的参数plys。请注意,:table部分是可选的,但明确表示假设总是很好的! - 然后,在脚本的最后,我们使用我们的
players表作为参数调用calculate_kd。
局部变量
接下来,我想介绍局部变量,但实际上你已经见过它们了!在上面的示例中,calculate_kd 函数的 plys 参数是一个局部变量,因为它只在该函数的主体内可用。
然而,除了通过将它作为函数参数具有局部变量的特性外,我们还可以手动定义一个,就像我们已经定义了变量一样,只是在它之前加上 local:
local a = 1
print(a)
试一试
nil 值
但是,当我们使用一个没有定义的变量,或者没有给它一个值时,会发生什么?
local no_value_given
print(no_value_given)
print(never_defined)
试一试
正如你所看到的,这会打印两次 "nil",所以这就是答案 — 在两种情况下我们得到了 nil。nil 是一种特殊的类型,用作没有值的表达式的结果。
下一步
现在,你应该已经对 Pluto 的基本原理有了一定的了解。如果你想了解更多,这份文档的其余部分肯定是了解 Pluto 更多信息的好地方。
你可以从我们在本指南中已经使用过的一些 Pluto 功能开始学习:
如果你想更深入地了解 Pluto 的基础知识,Lua 手册是一个不错的参考。