Aracılığıyla paylaş


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, existsaş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 Noneolmayan bir değere sahipse true döndürür.
Some 'T option Statik bir üye, değeri Noneolmayan bir seçenek oluşturur.
Değer 'T Temel alınan değeri döndürür veya değer Noneise 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.ArgumentExceptionhata 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.foldve Option.countiç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.toArraykullanın. Bir seçeneği listeye dönüştürmek için Option.toListkullanı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 Noneolmadığı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.

Ayrıca bkz.