F # - ตัวเลือก
optionประเภทใน F # ใช้ในการคำนวณเมื่ออาจมีหรือไม่มีค่าสำหรับตัวแปรหรือฟังก์ชัน ชนิดตัวเลือกใช้สำหรับแสดงค่าทางเลือกในการคำนวณ พวกเขาสามารถมีค่าที่เป็นไปได้สองค่า -Some(x) หรือ None.
ตัวอย่างเช่นฟังก์ชันที่ทำการหารจะส่งคืนค่าในสถานการณ์ปกติ แต่จะทำให้เกิดข้อยกเว้นในกรณีที่ตัวส่วนเป็นศูนย์ การใช้ตัวเลือกที่นี่จะช่วยระบุว่าฟังก์ชันนั้นสำเร็จหรือล้มเหลว
ตัวเลือกมีประเภทพื้นฐานและสามารถเก็บค่าของประเภทนั้นไว้ได้หรืออาจไม่มีค่า
การใช้ตัวเลือก
ให้เรานำตัวอย่างของฟังก์ชันการหาร โปรแกรมต่อไปนี้อธิบายสิ่งนี้ -
ให้เราเขียนฟังก์ชัน div และส่งอาร์กิวเมนต์สองตัวไปที่ 20 และ 5 -
let div x y = x / y
let res = div 20 5
printfn "Result: %d" res
เมื่อคุณคอมไพล์และรันโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -
Result: 4
หากอาร์กิวเมนต์ที่สองเป็นศูนย์โปรแกรมจะแสดงข้อยกเว้น -
let div x y = x / y
let res = div 20 0
printfn "Result: %d" res
เมื่อคุณคอมไพล์และรันโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -
Unhandled Exception:
System.DivideByZeroException: Division by zero
ในกรณีเช่นนี้เราสามารถใช้ชนิดตัวเลือกเพื่อส่งคืนค่าบางส่วน (ค่า) เมื่อการดำเนินการสำเร็จหรือไม่มีหากการดำเนินการล้มเหลว
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้ตัวเลือก -
ตัวอย่าง
let div x y =
match y with
| 0 -> None
| _ -> Some(x/y)
let res : int option = div 20 4
printfn "Result: %A " res
เมื่อคุณคอมไพล์และรันโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -
Result: Some 5
คุณสมบัติตัวเลือกและวิธีการ
ประเภทตัวเลือกรองรับคุณสมบัติและวิธีการต่อไปนี้ -
คุณสมบัติหรือวิธีการ | ประเภท | คำอธิบาย |
---|---|---|
ไม่มี | ตัวเลือก T | คุณสมบัติคงที่ที่ช่วยให้คุณสามารถสร้างค่าตัวเลือกที่มี None value. |
IsNone | บูล | ผลตอบแทน true ถ้าตัวเลือกมี None มูลค่า. |
IsSome | บูล | ผลตอบแทน true หากตัวเลือกมีค่าที่ไม่ใช่ None. |
บาง | ตัวเลือก T | สมาชิกแบบคงที่ที่สร้างอ็อพชันที่มีค่าที่ไม่ใช่ None. |
ค่า | 'ท | ส่งคืนค่าพื้นฐานหรือพ่น NullReferenceException หากค่าเป็น None. |
ตัวอย่าง 1
let checkPositive (a : int) =
if a > 0 then
Some(a)
else
None
let res : int option = checkPositive(-31)
printfn "Result: %A " res
เมื่อคุณคอมไพล์และรันโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -
Result: <null>
ตัวอย่าง 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
เมื่อคุณคอมไพล์และรันโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -
Result: Some 5
Result: 5
ตัวอย่างที่ 3
let isHundred = function
| Some(100) -> true
| Some(_) | None -> false
printfn "%A" (isHundred (Some(45)))
printfn "%A" (isHundred (Some(100)))
printfn "%A" (isHundred None)
เมื่อคุณคอมไพล์และรันโปรแกรมจะให้ผลลัพธ์ดังต่อไปนี้ -
false
true
false