我想指出F#中一个“有风险”的部分。请看下面的代码:
let mutable a, b as ab = 0, 0
a <- 4
a
ab
你将会得到
a = 4
和 ab = 0, 0
。这可能是正确的行为,我只是想指出并了解你的意见。你认为这种行为是否合理,为什么?我有些难以接受,因为我一直认为 (a, b) 和 ab 应该是相同的。我想指出F#中一个“有风险”的部分。请看下面的代码:
let mutable a, b as ab = 0, 0
a <- 4
a
ab
a = 4
和 ab = 0, 0
。这可能是正确的行为,我只是想指出并了解你的意见。你认为这种行为是否合理,为什么?我有些难以接受,因为我一直认为 (a, b) 和 ab 应该是相同的。如果你在 F# 交互环境中运行 let mutable a, b as ab = 0, 0
,你会得到:
val mutable ab : int * int = (0, 0)
val mutable b : int = 0
val mutable a : int = 0
虽然一开始可能会让人感到困惑,但一旦你理解了 F# 如何处理声明(如 Ankur 所解释的那样),它应该就很容易理解了。
如果你使用引用单元而不是可变变量,则可以获得另一种行为(其中修改一个值也会修改元组):
let a, b as ab = ref 0, ref 0
a := 4
!(fst ab) // returns 4