Lua 类型教程

lua-users home
wiki

本教程简要介绍 Lua 中的八种值类型:数字、字符串、布尔值、表、函数、nil、userdata、线程。每个部分介绍一种不同的类型。

请查看 TutorialExamples 获取有关在此运行示例的说明。我们将使用 print() 函数打印值或对这些值的计算结果。参数周围的括号很重要,省略它们会导致错误。

> print("hello") -- print the string hello.
hello

数字

数字类型表示浮点数(分数)。从 5.3 版本开始,整数(非分数)值有单独的内部表示。但是,这些也被认为是“数字”类型。

Lua 允许使用通常的运算符对数字进行简单的算术运算,以进行加、减、乘和除。

> print(2+2)
4
> print(2-7)
-5
> print(7*8)
56
> print(7/8)
0.875

请注意,数字不会被四舍五入为整数。它们是浮点数或实数。我们可以使用 = 运算符将值分配给变量。

> x = 7
> print(x)
7
= 运算符将数字 7 分配给变量 x。我们再次使用 print() 函数打印 x 的值。现在我们可以将 x 中的值用于其他计算。
> x = x * 9
> print(x)
63
> print(x*2) -- will not change the value of x
126
> print(x)
63

有关 Lua 数字类型的更多信息,您可以查看 NumbersTutorial

字符串

Lua 还使用字符串(即文本)类型。要创建字符串,请将文本括在 "双引号"'单引号'

> print("hello")
hello
我们可以像数字一样将字符串分配给变量
> who = "Lua user"
> print(who)
Lua user
我们可以使用 .. 运算符将字符串连接(连接)在一起
> print("hello ")
hello 
> print("hello " .. who) -- the variable "who" was assigned above
hello Lua user
> print(who)
Lua user

与其他一些语言不同,您不能使用 + 运算符连接字符串。例如:

> message = "hello " + who
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
        stdin:1: in main chunk
        [C]: ?

有关 Lua 字符串类型的更多信息,您可以查看 StringsTutorial

布尔值

布尔值的值为 truefalse。如果一个值不是 true,则它必须是 false,反之亦然。not 运算符可以放在布尔值之前以将其反转。例如,not true 等于 false

> x = true
> print(x)
true
> print(not x)
false
> print(not false)
true
布尔值用于表示逻辑测试的结果。等于 == 和不等于 ~= 运算符将根据提供给它们的值返回布尔值。
> print(1 == 0) -- test whether two numbers are equal
false
> print(1 == 1)
true
> print(1 ~= 0) -- test whether two numbers are not equal
true
> print(true ~= false) -- is true not equal to false?
true

请注意,对于赋值,您使用单个等号 (=),但对于比较,您使用双等号 (==)。这两个运算符具有不同的含义,但看起来很相似,在您想要使用另一个运算符时写错一个运算符是一个常见的错误。

有关 Lua 布尔类型的更多信息,您可以查看 表达式教程

Lua 拥有一个通用的聚合数据类型,称为表。聚合数据类型用于存储包含其他对象的集合(例如列表、集合、数组和关联数组)(包括数字、字符串,甚至其他聚合)。Lua 是一种独特的语言,因为它使用表(关联数组)来表示所有其他聚合类型。

表使用一对花括号 {} 创建。让我们创建一个空表

> x = {}
> print(x)
table: 0035C910
(如果您的表没有与上述示例相同的唯一标识符,这是正常的。)

表教程 将稍后解释如何使用表。

函数

在 Lua 中,函数被分配给变量,就像数字和字符串一样。函数使用 function 关键字创建。这里我们创建一个简单的函数,它将打印一条友好的消息。

> foo = function () print("hello") end -- declare the function
> foo() -- call the function
hello
> print(foo) -- get the value of the variable "foo"
function: 0035D6E8
请注意,我们可以打印变量 foo 的值,它显示(像表一样)该值是一个函数,并且具有该特定函数的唯一标识符。因此,作为与任何其他值一样的一个值,我们应该能够将函数分配给变量,就像其他值一样,我们也可以。
> x = function() print("hello") end
> x()
hello
> print(x)
function: 0035EA20
能够做到这一点是因为 Lua 具有一等值。这意味着所有值都以相同的方式对待。这是 Lua 的一个非常强大且有用的特性。

函数可以是表的一部分

> a = "aeiou" -- a string
> b = 13      -- a number
> c = function()  -- a function
>  print ("\n\n\tAin't it grand")
> end
> d = { a, b ,c} -- put them in a table
> function printit(tata)  -- print their types.
>> for key, value in ipairs(tata) do print(key, type(value)) end
>> end
> printit(d)
1       string
2       number
3       function
        

函数教程 将稍后解释如何使用函数。

nil 值

nil 是一个特殊的值,它表示缺少有用的值。如果您尝试获取一个不存在的变量,您将获得 nil

> print(x)
nil
> x = 2.5
> print(x)
2.5

nil 使用的其他地方将在其他教程中显示。

用户数据

用户数据值是 Lua 中的外部对象,例如在 C 中实现的对象。这些通常是在 C 库中的对象暴露给 Lua 时出现的。您无法在 Lua 中对用户数据值执行任何操作,除了传递它,它只对提供给由创建用户数据的相同 C 库公开的函数有用。但是使用元方法(在后面的教程中解释),可以使用户数据与运算符一起工作并类似于表。用户数据是一个更高级的主题,在 [Lua 参考手册] 中有更详细的讨论。

线程

线程值代表一个独立的(协作的)执行线程。这些将在协程教程中进一步讨论。

动态类型

您可能已经注意到,虽然我们创建了上面的变量,但我们不必指定要创建的变量类型。例如,

a = 1
b = "hello"
c = {}
在其他语言(如 C)中,我们在创建变量时必须指定变量的类型。在 Lua 中,我们也可以将不同类型的变量分配给同一个变量,例如
a = 1
a = "hello"
a = {}
Lua 具有动态类型。这意味着类型在程序运行时进行检查。与许多其他具有动态类型的编程语言一样,在 Lua 中您不必指定变量的类型。变量根据分配给它的值或对象来知道自己的类型。

查询类型

由于 Lua 是一种反射语言,我们可以使用 Lua 函数type()来获取特定对象的类型描述。

> x = "123"  -- a string
> print(x, type(x)) -- show the value of x and its type
123     string
> x = x + 7  -- add a number to the string which forces coercion
> print(x, type(x)) -- again show the value and type
130     number

最近更改 · 偏好设置
编辑 · 历史记录
最后编辑于 2024 年 1 月 25 日凌晨 12:51 GMT (差异)