3.1.3 声明可变值
在 3.1.1 节,我们声明过一个整数类型值,let number = 10。如果你很好奇,尝试进行修改,可能会写出类似 number = 10。这不起作用,因为在 F# 中,let 绑定之外的等于号只用于值的比较。代码虽然有效,但它可能会返回 false(除非 number 的值碰巧也是10)。在 F# 中修改已有的值几乎是不可能的。
事实并非如此,因为 F# 是务实的,有时你可能需要在 F# 中使用可变的值。这种情况最有可能发生在优化代码,或者使用可变的 .NET 对象时。清单 3.4 演示了如何在F# 中使用不可变和可变值,以及可变值的运算符。
清单 3.4 声明可变值(F# Interactive)
> let n1 = 22;; [1]
val n1 : int
> n1 <- 23;; | [2]
error FS0027: This value is not mutable. |
> let mutable n2 = 22;; [3]
val mutable n2 : int
> n2 <- 23;; | [4]
> n2;; |
val it : int = 23
值默认情况下,F# 中所有的值都是不可变的,因此,我们用通常的 let 绑定语法[1]声明的值,以后想使用赋值运算符(<-)对它进行修改,就会出现编译错误[2]。要声明可变的变量,必须显式使用 mutable 关键字[3]。这样,以后再使用赋值运算符对此值进行修改,从输出可以看到值已改变[4]。
注意
应该养成尽可能在 F# 中使用不可变值的习惯,只在真正必要时才使用可变值,并不是因为这样就一定是错的,而是不合乎语言习惯。函数式思维将使代码更简洁,更易于阅读和理解。当然,不要指望这会在一夜之间发生,但是,随着使用语言越多,而不是与习惯用法作对,就可能更多地从中摆脱。[是说使用可变值吗?]
这一节,我们已经学习了相当多的基本概念,但这是学习这一章核心部分之前所必须的。正如我们在第一章中提到过的,不可变性的默认用法不仅影响局部值的声明,而且还延伸到数据结构。在下一节,我们将讨论函数编程中最基本的不可变类型。