Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

变量与可变性

在 X 语言中,变量默认是不可变的。这是 X 语言鼓励你编写更安全、更符合函数式风格代码的方式之一。不过你仍然可以使用可变变量。让我们探讨一下为什么以及如何 X 语言鼓励你拥抱不可变性,以及何时你可能想要选择可变性。

变量

当变量不可变时,一旦值被绑定到一个名称上,你就不能改变这个值。作为演示,让我们在 ~/x-projects 目录创建一个名为 variables.x 的新项目:

let x = 5
println("x 的值是: ", x)
// 错误:x 是不可变的
// x = 6
// println("x 的值是: ", x)

保存并使用 x run variables.x 运行程序。你应该会看到一条关于不可变性错误的消息(如果你取消了注释的话)。

这个例子展示了编译器如何帮助你找出程序中的错误。虽然编译错误可能令人沮丧,但它们只是意味着你的程序不能安全地做你想让它做的事情;它们并不意味着你不是一个好程序员!

注意,在这个例子中,我们没有使用 main 函数——直接在文件顶层编写代码也是可以的!

可变性

我们可以通过在变量名前添加 mutable 来使变量可变。除了允许改变值之外,它还向读者传达了代码的其他部分将会改变这个变量的值的意图。

让我们修改 variables.x

let mutable x = 5
println("x 的值是: ", x)
x = 6
println("x 的值是: ", x)

现在运行程序,我们看到:

x 的值是: 5
x 的值是: 6

使用 mutable,我们被允许将 x 绑定的值从 5 改为 6。在某些情况下,你会想要使变量可变,因为这会使代码更容易编写。

常量

与不可变变量类似,常量是绑定到一个名称且不允许改变的值,但常量和变量之间有一些区别:

  1. 你不允许对常量使用 mutable
  2. 你使用 const 关键字而不是 let
  3. 你必须标注类型。
  4. 你只能设置常量为常量表达式,而不能是函数调用的结果或任何只能在运行时计算的值。

这是一个常量声明的例子:

const MAX-RETRY-COUNT: integer = 3
const APP-NAME: string = "x-lang"

X 语言的常量命名约定是使用连字符(kebab-case)分隔单词,因为连字符比下划线更易读。

遮蔽

你可以声明一个与之前的变量同名的新变量,我们说第一个变量被第二个变量遮蔽了,这意味着第二个变量的值是你使用该名称时会看到的。你可以通过使用相同的变量名并重复使用 let 关键字来遮蔽变量:

let x = 5
let x = x + 1
let x = x * 2
println("x 的值是: ", x)

这个程序首先将 x 绑定到值 5。然后通过 let x = 遮蔽 x,获取原始值并加 1,所以 x 的值变成了 6。第三个 let 语句也遮蔽了 x,将之前的值乘以 2,所以 x 的最终值是 12

遮蔽与将变量标记为 mutable 是不同的,因为如果我们不小心尝试重新赋值给这个变量而没有使用 let 关键字,我们会得到一个编译错误。通过使用 let,我们可以对值执行一些转换,但在这些转换完成之后,变量是不可变的。

mutable 和遮蔽的另一个区别是,因为我们在再次使用 let 关键字时实际上创建了一个新变量,所以我们可以改变值的类型,同时重用相同的名称。

总结

我们已经探讨了 X 语言中变量的工作方式。让我们继续学习数据类型!