F # - Dữ liệu có thể thay đổi
Các biến trong F # là immutable,có nghĩa là một khi một biến được liên kết với một giá trị, nó sẽ không thể thay đổi được. Chúng thực sự được biên dịch dưới dạng thuộc tính chỉ đọc tĩnh.
Ví dụ sau đây chứng minh điều này.
Thí dụ
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
Khi bạn biên dịch và thực thi chương trình, nó hiển thị thông báo lỗi sau:
Duplicate definition of value 'x'
Duplicate definition of value 'Y'
Duplicate definition of value 'Z'
Các biến có thể thay đổi
Đôi khi bạn cần thay đổi các giá trị được lưu trữ trong một biến. Để xác định rằng có thể có sự thay đổi về giá trị của một biến được khai báo và gán trong phần sau của chương trình, F # cung cấpmutabletừ khóa. Bạn có thể khai báo và gán các biến có thể thay đổi bằng cách sử dụng từ khóa này, các giá trị của chúng mà bạn sẽ thay đổi.
Các mutable từ khóa cho phép bạn khai báo và gán giá trị trong một biến có thể thay đổi.
Bạn có thể gán một số giá trị ban đầu cho một biến có thể thay đổi bằng cách sử dụng lettừ khóa. Tuy nhiên, để gán giá trị tiếp theo mới cho nó, bạn cần sử dụng<- nhà điều hành.
Ví dụ,
let mutable x = 10
x <- 15
Ví dụ sau sẽ rõ ràng khái niệm -
Thí dụ
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
Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:
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
Sử dụng dữ liệu có thể thay đổi
Dữ liệu có thể thay đổi thường được yêu cầu và sử dụng trong xử lý dữ liệu, đặc biệt là với cấu trúc dữ liệu bản ghi. Ví dụ sau đây chứng minh điều này -
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()
Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:
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";}