F # - Dados mutáveis
Variáveis em F # são immutable,o que significa que uma vez que uma variável está vinculada a um valor, ela não pode ser alterada. Na verdade, eles são compilados como propriedades estáticas somente leitura.
O exemplo a seguir demonstra isso.
Exemplo
let x = 10
let y = 20
let z = x + y
printfn "x: %i" x
printfn "y: %i" y
printfn "z: %i" z
let x = 15
let y = 20
let z = x + y
printfn "x: %i" x
printfn "y: %i" y
printfn "z: %i" z
Quando você compila e executa o programa, ele mostra a seguinte mensagem de erro -
Duplicate definition of value 'x'
Duplicate definition of value 'Y'
Duplicate definition of value 'Z'
Variáveis Mutáveis
Às vezes, você precisa alterar os valores armazenados em uma variável. Para especificar que pode haver uma mudança no valor de uma variável declarada e atribuída na parte posterior de um programa, F # fornece omutablepalavra-chave. Você pode declarar e atribuir variáveis mutáveis usando esta palavra-chave, cujos valores você irá alterar.
o mutable palavra-chave permite declarar e atribuir valores em uma variável mutável.
Você pode atribuir algum valor inicial a uma variável mutável usando o letpalavra-chave. No entanto, para atribuir um novo valor subsequente a ele, você precisa usar o<- operador.
Por exemplo,
let mutable x = 10
x <- 15
O exemplo a seguir irá limpar o conceito -
Exemplo
let mutable x = 10
let y = 20
let mutable z = x + y
printfn "Original Values:"
printfn "x: %i" x
printfn "y: %i" y
printfn "z: %i" z
printfn "Let us change the value of x"
printfn "Value of z will change too."
x <- 15
z <- x + y
printfn "New Values:"
printfn "x: %i" x
printfn "y: %i" y
printfn "z: %i" z
Quando você compila e executa o programa, ele produz a seguinte saída -
Original Values:
x: 10
y: 20
z: 30
Let us change the value of x
Value of z will change too.
New Values:
x: 15
y: 20
z: 35
Usos de dados mutáveis
Os dados mutáveis são frequentemente necessários e usados no processamento de dados, especialmente com estrutura de dados de registro. O exemplo a seguir demonstra isso -
open System
type studentData =
{ ID : int;
mutable IsRegistered : bool;
mutable RegisteredText : string; }
let getStudent id =
{ ID = id;
IsRegistered = false;
RegisteredText = null; }
let registerStudents (students : studentData list) =
students |> List.iter(fun st ->
st.IsRegistered <- true
st.RegisteredText <- sprintf "Registered %s" (DateTime.Now.ToString("hh:mm:ss"))
Threading.Thread.Sleep(1000) (* Putting thread to sleep for 1 second to simulate processing overhead. *))
let printData (students : studentData list) =
students |> List.iter (fun x -> printfn "%A" x)
let main() =
let students = List.init 3 getStudent
printfn "Before Process:"
printData students
printfn "After process:"
registerStudents students
printData students
Console.ReadKey(true) |> ignore
main()
Quando você compila e executa o programa, ele produz a seguinte saída -
Before Process:
{ID = 0;
IsRegistered = false;
RegisteredText = null;}
{ID = 1;
IsRegistered = false;
RegisteredText = null;}
{ID = 2;
IsRegistered = false;
RegisteredText = null;}
After process:
{ID = 0;
IsRegistered = true;
RegisteredText = "Registered 05:39:15";}
{ID = 1;
IsRegistered = true;
RegisteredText = "Registered 05:39:16";}
{ID = 2;
IsRegistered = true;
RegisteredText = "Registered 05:39:17";}