Seçenekler
F# içindeki seçenek türü, adlandırılmış bir değer veya değişken için gerçek bir değer mevcut olmadığında kullanılır. Bir seçenek, temel alınan bir türe sahiptir ve bu türde bir değeri tutabilir veya bir değeri olmayabilir.
Açıklamalar
Aşağıdaki kod, seçenek türü oluşturan bir işlevi gösterir.
let keepIfPositive (a: int) = if a > 0 then Some(a) else None
Gördüğünüz gibi giriş a
0'dan büyükse Some(a)
oluşturulur. Aksi takdirde, None
oluşturulur.
None
değeri, bir seçeneğin gerçek değeri olmadığında kullanılır. Aksi takdirde, Some( ... )
ifadesi seçeneğine bir değer verir.
Some
ve None
değerleri, exists
aşağıdaki işlevde olduğu gibi desen eşleştirmede yararlıdır. Bu, seçeneğin bir değeri varsa true
döndürür ve değilse false
.
let exists (x: int option) =
match x with
| Some(x) -> true
| None -> false
Seçenekleri Kullanma
Seçenekler genellikle aşağıdaki kodda gösterildiği gibi bir arama eşleşen sonuç döndürmediğinde kullanılır.
let rec tryFindMatch pred list =
match list with
| head :: tail -> if pred (head) then Some(head) else tryFindMatch pred tail
| [] -> None
// result1 is Some 100 and its type is int option.
let result1 = tryFindMatch (fun elem -> elem = 100) [ 200; 100; 50; 25 ]
// result2 is None and its type is int option.
let result2 = tryFindMatch (fun elem -> elem = 26) [ 200; 100; 50; 25 ]
Önceki kodda, bir listede özyinelemeli olarak arama yapılır. İşlev tryFindMatch
, boole değeri döndüren bir öncül işlevi pred
ve aranacak bir liste alır. Koşulu karşılayan bir öğe bulunursa, özyineleme sona erer ve işlev değeri Some(head)
ifadesinde bir seçenek olarak döndürür. Özyineleme, boş liste eşleştirildiğinde sona erer. Bu noktada head
değeri bulunamadı ve None
döndürülür.
Bir koleksiyonda var olabilecek veya varolmayan bir değeri arayan birçok F# kitaplığı işlevi option
türünü döndürür. Kural gereği, bu işlevler try
ön eki ile başlar, örneğin, Seq.tryFindIndex
.
Seçenekler, bir değer mevcut olmayabileceği durumlarda da faydalı olabilir; örneğin, bir değer oluşturmaya çalıştığınızda bir istisna oluşturulabileceği durumlarda. Aşağıdaki kod örneği bunu göstermektedir.
open System.IO
let openFile filename =
try
let file = File.Open(filename, FileMode.Create)
Some(file)
with ex ->
eprintf "An exception occurred with message %s" ex.Message
None
Önceki örnekteki openFile
işlevinin türü string -> File option
çünkü dosya başarıyla açılırsa File
bir nesne döndürür ve bir özel durum oluşursa None
. Duruma bağlı olarak, bir özel durumu yakalamak yerine onun yayılmasına izin vermek daha uygun bir tasarım seçimi olmayabilir.
Ayrıca, null
veya değeri null olan bir değeri bir seçeneğin Some
durumu için geçirmek de mümkündür. Bu genellikle önlenmelidir ve genellikle rutin F# programlamasındadır, ancak .NET'teki başvuru türlerinin doğası nedeniyle mümkündür.
Seçenek Özellikleri ve Yöntemleri
Seçenek türü aşağıdaki özellikleri ve yöntemleri destekler.
Özellik veya yöntem | Tür | Açıklama |
---|---|---|
None |
'T option |
None değerine sahip bir seçenek değeri oluşturan statik üye. |
IsNone | bool |
Seçeneğin None değeri varsa true döndürür. |
IsSome | bool |
seçeneği None olmayan bir değere sahipse true döndürür. |
Some |
'T option |
Statik bir üye, değeri None olmayan bir seçenek oluşturur. |
Değer | 'T |
Temel alınan değeri döndürür veya değer None ise bir System.NullReferenceException fırlatır. |
Seçenek Modülü
Seçenekler üzerinde işlem gerçekleştiren kullanışlı işlevler içeren Optionmodülü vardır. Bazı işlevler özelliklerin işlevselliğini yineler, ancak bir işlevin gerekli olduğu bağlamlarda kullanışlıdır.
Option.isSome ve Option.isNone, bir seçeneğin değer barındırıp tutmadığını test eden modül işlevleridir.
Option.get bir değer varsa onu alır. Değer yoksa, System.ArgumentException
hata verir.
Option.bind işlevi, eğer bir değer varsa, değer üzerinde bir işlevi yürütür. İşlev tam olarak bir bağımsız değişken almalı ve parametre türü seçenek türü olmalıdır. İşlevin dönüş değeri başka bir seçenek türüdür.
Seçenek modülü listeler, diziler, diziler ve diğer koleksiyon türleri için kullanılabilen işlevlere karşılık gelen işlevleri de içerir. Bu işlevler Option.map
, Option.iter
, Option.forall
, Option.exists
, Option.foldBack
, Option.fold
ve Option.count
içerir. Bu işlevler, seçeneklerin sıfır veya bir öğe koleksiyonu gibi kullanılmasını sağlar. Daha fazla bilgi ve örnek için Listeleri'nde koleksiyon işlevlerinin tartışmasını inceleyin.
Diğer Türlere Dönüştürme
Seçenekler listelere veya dizilere dönüştürülebilir. Bir seçenek bu veri yapılarından birine dönüştürüldüğünde, sonuçta elde edilen veri yapısı sıfır veya bir öğeye sahiptir. Bir seçeneği diziye dönüştürmek için Option.toArray
kullanın. Bir seçeneği listeye dönüştürmek için Option.toList
kullanın.
Varsayılan Değerlerle Seçenekleri Dönüştürme
Listelere ve dizilere dönüştürmeye ek olarak, seçenekler Option.defaultValue
işlevi kullanılarak varsayılan değerler sağlanarak diğer türlere dönüştürülebilir. Bu, değerinin None
olmadığından emin olmak istediğinizde özellikle yararlıdır. Örneğin:
let optionString = Some("F#")
let defaultString = optionString |> Option.defaultValue ""
// defaultString is "F#"
let optionInt = None
let defaultInt = optionInt |> Option.defaultValue 0
// defaultInt is 0
Option.defaultValue
işlevi, desen eşleştirmesi olmadan hem Some
hem de None
durumlarını sorunsuz bir şekilde işlemenizi sağlar.