F # - Tùy chọn

Các optiongõ F # được sử dụng trong tính toán khi có thể có hoặc không tồn tại một giá trị cho một biến hoặc hàm. Các loại tùy chọn được sử dụng để biểu diễn các giá trị tùy chọn trong tính toán. Chúng có thể có hai giá trị khả dĩ -Some(x) hoặc là None.

Ví dụ: một hàm thực hiện phép chia sẽ trả về một giá trị trong trường hợp bình thường, nhưng sẽ ném ra các ngoại lệ trong trường hợp mẫu số bằng không. Sử dụng các tùy chọn ở đây sẽ giúp cho biết chức năng đã thành công hay thất bại.

Một tùy chọn có một loại cơ bản và có thể giữ một giá trị của loại đó hoặc nó có thể không có một giá trị.

Sử dụng Tùy chọn

Chúng ta hãy lấy ví dụ về hàm chia. Chương trình sau giải thích điều này -

Hãy để chúng tôi viết một hàm div và gửi hai đối số cho nó 20 và 5 -

let div x y = x / y
let res = div 20 5
printfn "Result: %d" res

Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:

Result: 4

Nếu đối số thứ hai là 0, thì chương trình sẽ ném ra một ngoại lệ -

let div x y = x / y
let res = div 20 0
printfn "Result: %d" res

Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:

Unhandled Exception:
System.DivideByZeroException: Division by zero

Trong những trường hợp như vậy, chúng ta có thể sử dụng các loại tùy chọn để trả về Một số (giá trị) khi hoạt động thành công hoặc Không có nếu hoạt động không thành công.

Ví dụ sau minh họa việc sử dụng các tùy chọn:

Thí dụ

let div x y =
   match y with
   | 0 -> None
   | _ -> Some(x/y)

let res : int option = div 20 4
printfn "Result: %A " res

Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:

Result: Some 5

Thuộc tính và phương pháp tùy chọn

Loại tùy chọn hỗ trợ các thuộc tính và phương thức sau:

Thuộc tính hoặc phương pháp Kiểu Sự miêu tả
không ai 'T tùy chọn Thuộc tính tĩnh cho phép bạn tạo giá trị tùy chọn có None value.
IsNone bool Lợi nhuận true nếu tùy chọn có None giá trị.
Là một số bool Lợi nhuận true nếu tùy chọn có giá trị không None.
Một số 'T tùy chọn Thành viên tĩnh tạo ra một tùy chọn có giá trị không None.
Giá trị 'T Trả về giá trị cơ bản hoặc ném một NullReferenceException nếu giá trị là None.

ví dụ 1

let checkPositive (a : int) =
   if a > 0 then
      Some(a)
   else
      None

let res : int option = checkPositive(-31)
printfn "Result: %A " res

Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:

Result: <null>

Ví dụ 2

let div x y =
   match y with
   | 0 -> None
   | _ -> Some(x/y)

let res : int option = div 20 4
printfn "Result: %A " res
printfn "Result: %A " res.Value

Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:

Result: Some 5
Result: 5

Ví dụ 3

let isHundred = function
   | Some(100) -> true
   | Some(_) | None -> false

printfn "%A" (isHundred (Some(45)))
printfn "%A" (isHundred (Some(100)))
printfn "%A" (isHundred None)

Khi bạn biên dịch và thực thi chương trình, nó sẽ tạo ra kết quả sau:

false
true
false