Khi bạn viết let x = 3
, bạn phải ràng buộc các định danh x
với giá trị 3
. Nếu bạn làm điều đó lần thứ hai trong cùng một phạm vi, bạn đang khai báo một mã định danh mới ẩn phần trước đó vì nó có cùng tên.
Việc tắt một giá trị trong F # được thực hiện thông qua toán tử cập nhật phá hủy, <-
. Điều này sẽ không cho các giá trị bất biến, tức là .:
> let x = 3;;
val x : int = 3
> x <- 5;;
x <- 5;;
^^^^^^
stdin(2,1): error FS0027: This value is not mutable
Để khai báo một biến có thể thay đổi, thêm mutable
sau let
:
let mutable x = 5;;
val mutable x : int = 5
> x <- 6;;
val it : unit =()
> x;;
val it : int = 6
Nhưng những gì là sự khác biệt giữa hai, bạn có thể yêu cầu? Ví dụ có thể là đủ:
let i = 0;
while i < 10 do
let i = i + 1
()
Mặc dù xuất hiện, đây là vòng lặp vô hạn. Các i
tuyên bố bên trong vòng lặp là một i
khác nhau mà ẩn bên ngoài. Cái bên ngoài là không thay đổi, vì vậy nó luôn giữ giá trị 0
và vòng lặp không bao giờ kết thúc. Các cách chính xác để viết những dòng này là với một biến có thể thay đổi:
let mutable i = 0;
while i < 10 do
i <- i + 1
()
Có thể trùng lặp của http://stackoverflow.com/questions/2844047/what-is-the-key-inword-in-functional-languages -like-f-và-ocaml-for.Các câu trả lời có giải thích sự khác biệt giữa biến ràng buộc và chuyển nhượng biến. – Heatsink
@ Alex: Bạn có thể tìm thấy câu trả lời cho [câu hỏi này] (http://stackoverflow.com/questions/2478079/f-shadowing-and-nested-function) hữu ích. – Daniel
Câu hỏi tương tự nhưng không trùng lặp. –