Cuando se escribe let x = 3
, que son vinculantes para el identificador x
al valor 3
. Si lo hace por segunda vez en el mismo ámbito, está declarando un nuevo identificador que oculta el anterior, ya que tiene el mismo nombre.
La mutación de un valor en F # se realiza a través del operador de actualización destructiva, <-
. Esto se producirá un error para los valores inmutables, es decir .:
> let x = 3;;
val x : int = 3
> x <- 5;;
x <- 5;;
^^^^^^
stdin(2,1): error FS0027: This value is not mutable
Declarar una variable mutable, añadir mutable
después let
:
let mutable x = 5;;
val mutable x : int = 5
> x <- 6;;
val it : unit =()
> x;;
val it : int = 6
pero ¿cuál es la diferencia entre los dos, usted puede pedir? Un ejemplo puede ser suficiente:
let i = 0;
while i < 10 do
let i = i + 1
()
A pesar de las apariencias, este es un ciclo infinito. El i
declarado dentro del ciclo es un i
diferente que oculta el exterior. El exterior es inmutable, por lo que siempre mantiene su valor 0
y el bucle nunca termina. La forma correcta de escribir esto es con una variable mutable:
let mutable i = 0;
while i < 10 do
i <- i + 1
()
Posible duplicado de http://stackoverflow.com/questions/2844047/what-is-the-let-keyword-in-functional-languages -like-f-and-ocaml-for.Las respuestas allí explican la distinción entre enlace variable y asignación variable. – Heatsink
@Alex: Puede encontrar las respuestas a [esta pregunta] útiles (http://stackoverflow.com/questions/2478079/f-shadowing-and-nested-function). – Daniel
La pregunta es similar pero no es un duplicado. –