在FSI I型爲什麼FSharp交互允許mutable讓?
> let a = 10;;
val a : int = 10
> let a = a + 1;;
val a : int = 11
看起來像我在這裏有一個可變的變量?我錯過了什麼嗎?
在FSI I型爲什麼FSharp交互允許mutable讓?
> let a = 10;;
val a : int = 10
> let a = a + 1;;
val a : int = 11
看起來像我在這裏有一個可變的變量?我錯過了什麼嗎?
這不是一個可變值。但是你使用陰影:在F#中,當在特定範圍(判定塊,方法或內部類)中聲明的變量與在外部範圍中聲明的變量名稱相同時,會發生值陰影。
如果你想有一個可變值,有F#中syntaxe:
let mutable a = 10
a <- a + 1
由於已經由亞瑟,你看到的是陰影這意味着原來的「變量」命名a
解釋被名爲a
的新「變量」隱藏(我在引號中使用變量,因爲它們實際上是不可變的值)。
要看到其中的差別,你可以在一個函數獲取原始值,然後隱藏原始值後,打印出值:
> let a = 10;; // Define the original 'a' value
val a : int = 10
> let f() = a;; // A function captures the original value
val f : unit -> int
> let a = 42;; // Define a new value hiding the first 'a'
val a : int = 42
> f();; // Prints the original value - it is not mutated!
val it : int = 10
可悲的是,你不能使用完全相同的代碼,看看如何let mutable
的行爲(因爲F#不允許捕捉封可變參考),但你可以看到突變,當您使用參考單元(也就是一個簡單的對象,在堆存儲可變值):
> let a = ref 10;; // Create a mutable reference cell initialized to 10
val a : int ref = {contents = 10;}
> let f() = !a;; // A function reads the current value of the cell
val f : unit -> int
> a := 42;; // Overwrite the value in the cell with 42
val it : unit =()
> f();; // Prints the new value - it is mutated
val it : int = 42
您可以在F#interactive中逐行運行代碼,但是當您複製整個代碼片段(輸入行)並將它們放入正常的F#代碼中時,它會執行完全相同的操作。在一個函數或模塊中。 ;;
只是爲了結束F#交互式輸入(我在F#交互式窗口中鍵入代碼)中的行,但它在普通代碼中不需要,因爲F#使用縮進找出語句結束的位置。
你能否在這裏詳細說明,因爲它看起來像變量在相同的範圍內進行了變異。注意''let a = a + 1'' – bradgonesurfing 2013-04-21 19:20:30
@bradgonesurfing:你只需要兩個同名的(_different_)值。 – ildjarn 2013-04-21 19:30:58
好吧,我只是在FSI說服了自己。但是,這個FSI是用雙冒號'';;''特定的還是總是這樣工作的? – bradgonesurfing 2013-04-21 19:35:00