Aracılığıyla paylaş


Parametreleri ve bağımsız değişkenler (F#)

Bu konuda bağımsız değişkenler, İşlevler, yöntemler ve Özellikler geçirerek ve parametreleri tanımlamak için dil desteğini açıklar. Bu başvuruya göre nasıl ve nasıl tanımlamak ve bağımsız değişken sayısı uygulayabileceğiniz yöntemler hakkında bilgiler içerir.

Parametreleri ve bağımsız değişkenleri

Bu terim parametre sağlanması için beklenen değer adlarını tanımlamak için kullanılır. Bu terim bağımsız değişken her ' % s'parametre parametreiçin sağlanan değerleri için kullanılır.

Kayıt düzeni veya curried formveya ikisinin bileşimi parametresi belirtilebilir. Açık parametre adını kullanarak bağımsız değişkenler iletebilirsiniz. Yöntem parametrelerinin, isteğe bağlı olarak belirtilen ve varsayılan değerverilir.

Parametre desenleri

Sağlanan işlevleri ve yöntemleri, genel olarak, boşluklarla ayrılmış desenleri parametreleridir. prensipdesenlerden birini açıklandığı, yani Eþleþme deyimleriyle (F#) bir işlev veya üye için bir parametre listesinde kullanılabilir.

Yöntemler genellikle argümanları kayıt düzeni form kullanın. Bu, diğer açısından bakıldığında daha net bir sonuç erişir.form kayıt düzeni argüman olarak iletilen şekilde eşleştiğinden dilleri net.net yöntemleri.

Curried form en sık kullanılan işlevleri kullanılarak oluşturulan let bağlar.

Aşağıdaki yarı kod örnekleri kayıt düzeni ve curried bağımsız değişkeni gösterir.

// Tuple form.
member this.SomeMethod(param1, param2) = ...
// Curried form.
let function1 param1 param2 = ...

Birleştirilen form içinde dizilerini bazı bağımsız değişkenler, bazılarının ise olmadığı zaman mümkün olabilir.

let function2 param1 (param2a, param2b) param3 = ...

Diðer desenleri parametre listelerde de kullanılabilir, ancak tüm olası girdi parametre desenle eşleşmiyor, olabilir tam bir eşleşme zamanında. özel durum MatchFailureException bir bağımsız değişken değişkenin değeri parametre listesinde belirtilen desenleri eşleşmediğinde oluşturulur. Tam eşleşmeleri için bir parametre desen izin verdiğinde derleyici uyarı verir. parametre listeleri için en az bir desen genellikle yararlıdır ve joker desen. Sadece sağlanan herhangi bir bağımsız değişkeni yok saymak istediğinizde bir parametre listesinde joker kalıbını kullanırsınız. Aşağıdaki kod bir bağımsız değişken listesindeki joker desen kullanımını göstermektedir.

let makeList _ = [ for i in 1 .. 100 -> i * i ]
// The arguments 100 and 200 are ignored.
let list1 = makeList 100
let list2 = makeList 200

Aşağıdaki kodda olduğu gibi bir dize dizisi olarak normal olarak sağlanan komut -çizgi değişkenleri ilgileniyorsanız olmadığında, bağımsız geçirilen, programana girdi noktası gibi gerek yoktur her joker desen yararlı olabilir.

[<EntryPoint>]
let main _ =
    printfn "Entry point!"
    0

Bazen bağımsız değişkenleri kullanılan diğer desenleri olan as desen ve discriminated sendikalar ve etkin desenleri ile ilişkili tanımlayıcı desenleri. Tek-case discriminated Birliği desen gibi kullanabilirsiniz.

type Slice = Slice of int * int * string

let GetSubstring1 (Slice(p0, p1, text)) = 
    printfn "Data begins at %d and ends at %d in string %s" p0 p1 text
    text.[p0..p1]

let substring = GetSubstring1 (Slice(0, 4, "Et tu, Brute?"))
printfn "Substring: %s" substring

Çıktı aşağıdaki gibidir.

Data begins at 0 and ends at 4 in string Et tu, Brute?
Et tu

Etkin desenleri bağımsız değişken aşağıdaki örnekte olduğu gibi istenilen bir biçime dönüştürüldüğünde parametre olarak, örneğin, yararlı olabilir:

type Point = { x : float; y : float }
let (| Polar |) { x = x; y = y} =
    ( sqrt (x*x + y*y), System.Math.Atan (y/ x) )

let radius (Polar(r, _)) = r
let angle (Polar(_, theta)) = theta

Kullanabileceğiniz as aşağıdaki çizgi kodunun gösterildiği gibi yerel bir değer olarak, eşleşen bir değer depolamak için desen.

let GetSubstring2 (Slice(p0, p1, text) as s) = s

Ara sıra kullanılan başka bir desen bırakır, işlevgövdesi olarak sağlayarak adlandırılmamış son bağımsız değişken işlev , hemen üzerinde örtülü bağımsız değişkenbir desen eşleşmesi gerçekleştiren lambda ifadesi olur. Bu kod aşağıdaki çizgi örneğidir.

let isNil = function [] -> true | _::_ -> false

Bu kod genel listesini alır ve döndüren bir işlev tanımlar true listesi boşsa ve false Aksi durumda. Bu tür teknikler kullanılması kod okumak daha zor hale getirebilirsiniz.

Bazen, tamamlanmamış eşleşmeleri içeren desenler yararlıdır, program listelerini yalnızca üç öğe olduğunu biliyorsanız, örneğin, desen aşağıdaki gibi bir parametre listesinde kullanabilirsiniz.

let sum [a; b; c;] = a + b + c

Tam eşleşmeleri olan desenler kullanılması en hızlı prototipleme ve geçici diğer kullanımlar için ayrılmıştır. derleyici tür kodu için bir uyarı verecek. Böyle desenleri tüm olası girişleri genel harf kapak olamaz ve bu nedenle bileşen için API uygun değildir.

Adlandırılmış bağımsız değişkenler

Yöntem bağımsız değişkenleri virgülle ayrılmış bağımsız değişken listesindeki konumu olarak belirtilebilir veya bunlar için bir yöntem açıkça adı bir eşittir işareti ve değeri olarak iletilmesi sonrasında sağlayarak geçirilebilir. Belirtilen ad sağlayarak, bildirimkullanılan ile farklı bir sırada görünebilir.

Adlandırılmış bağımsız değişkenler kodu daha okunaklı ve daha uyarlanabilir belirli türden bir yöntem parametrelerinin sipariş gibi API değişiklikler yapabilirsiniz.

Adlandırılmış bağımsız değişkenler için değil yalnızca yöntemleri için verilir let-ilişkili İşlevler, işlev değerleri veya lambda ifadeleri.

Aşağıdaki kod örneği, adlandırılmış değişkenleri kullanımını gösterir.

type SpeedingTicket() =
    member this.GetMPHOver(speed: int, limit: int) = speed - limit

let CalculateFine (ticket : SpeedingTicket) =
    let delta = ticket.GetMPHOver(limit = 55, speed = 70)
    if delta < 20 then 50.0 else 100.0

let ticket1 : SpeedingTicket = SpeedingTicket()
printfn "%f" (CalculateFine ticket1)

Çağrıda sınıf oluşturucu, adlandırılmış bağımsız değişkenleri için benzer bir sözdizimi kullanarak sınıf özelliklerinin değerlerini ayarlayabilirsiniz. Aşağıdaki örnekte, bu sözdizimi gösterilmektedir.

 type Account() =
    let mutable balance = 0.0
    let mutable number = 0
    let mutable firstName = ""
    let mutable lastName = ""
    member this.AccountNumber
       with get() = number
       and set(value) = number <- value
    member this.FirstName
       with get() = firstName
       and set(value) = firstName <- value
    member this.LastName
       with get() = lastName
       and set(value) = lastName <- value
    member this.Balance
       with get() = balance
       and set(value) = balance <- value
    member this.Deposit(amount: float) = this.Balance <- this.Balance + amount
    member this.Withdraw(amount: float) = this.Balance <- this.Balance - amount


let account1 = new Account(AccountNumber=8782108, 
                           FirstName="Darren", LastName="Parker",
                           Balance=1543.33)

Daha fazla bilgi için bkz: Kurucular (F#).

İsteğe bağlı parametreler

parametre adının önünde bir soru işareti kullanarak bir yöntem için isteğe bağlı bir parametre belirtebilirsiniz. İsteğe bağlı parametreler F# seçenek türü olarak yorumlanır, sorgu , böylece bunları normal yoldan seçenek türleri, kullanarak sorgulanır bir match ifadesiyle Some ve None. İsteğe bağlı parametreler kullanılarak oluşturulan işlevleri hakkında üyeleri üzerinde yalnızca izin let bağlar.

Bir işlevde kullanılabilirdefaultArg, isteğe bağlı bağımsız değişken varsayılan değer ayarlar. defaultArg işlev ilk bağımsız değişken olarak parametre isteğe bağlıdır ve ikinci olarak varsayılan değer alır.

Aşağıdaki örnek, isteğe bağlı parametreleri kullanımını göstermektedir.

type DuplexType =
    | Full
    | Half

type Connection(?rate0 : int, ?duplex0 : DuplexType, ?parity0 : bool) =
    let duplex = defaultArg duplex0 Full
    let parity = defaultArg parity0 false
    let mutable rate = match rate0 with
                        | Some rate1 -> rate1
                        | None -> match duplex with
                                  | Full -> 9600
                                  | Half -> 4800
    do printfn "Baud Rate: %d Duplex: %A Parity: %b" rate duplex parity

let conn1 = Connection(duplex0 = Full)
let conn2 = Connection(duplex0 = Half)
let conn3 = Connection(300, Half, true)

Çıktı aşağıdaki gibidir.

Baud Rate: 9600 Duplex: Full Parity: false
Baud Rate: 4800 Duplex: Half Parity: false
Baud Rate: 300 Duplex: Half Parity: true

Başvuruya göre iletmenin

F# destekler byrefbelirten bir parametre başvuruya göre iletilir anahtar sözcük,. Buna göre işlevyürütme sonrasında değer değişiklikler korunur. Değerleri için sağlanan bir byref parametre kesilebilir olmalıdır. Alternatif olarak, uygun türü hücrelere başvurma iletebilirsiniz.

Başvurusunda geçirerek.net dilleri bir işlevbirden fazla değer dönmek için bir yol olarak hale geldi. F#, bu amaçla bir kayıt düzeni dönmek veya kesilebilir başvuru hücre parametreolarak kullanmak. byref parametre ile birlikte çalışabilirlik için sağlanan çoğunlukla.AĞ kitaplıkları.

Aşağıdaki örnekler kullanımını göstermektedir byref anahtar sözcük. Not parametreolarak bir başvuru hücre kullandığınızda oluşturmak başvuru hücre adlandırılmış değeri ve parametreolarak değil yalnızca Ekle kullanma gerekir olduğunu refilk çaðrýdan gösterildiği gibi işleç Increment aşağıdaki kodda. Başvuru hücre oluşturma ona temel olan değeri bir kopyasını oluşturduğundan, ilk çağrı yalnızca geçici değerini artırır.

type Incrementor(z) =
    member this.Increment(i : int byref) =
       i <- i + z

let incrementor = new Incrementor(1)
let mutable x = 10
// Not recommended: Does not actually increment the variable.
incrementor.Increment(ref x)
// Prints 10.
printfn "%d" x  

let mutable y = 10
incrementor.Increment(&y)
// Prints 11.
printfn "%d" y 

let refInt = ref 10
incrementor.Increment(refInt)
// Prints 11.
printfn "%d" !refInt  

Kayıt düzeni herhangi depolamak için bir dönüş değeri kullanabileceğiniz out parametreleri.Ağ kitaplık yöntemleri. Alternatif olarak, kabul out parametre olarak bir byref parametre. Aşağıdaki kod örneği, her iki yönde göstermektedir.

// TryParse has a second parameter that is an out parameter
// of type System.DateTime.
let (b, dt) = System.DateTime.TryParse("12-20-04 12:21:00")

printfn "%b %A" b dt

// The same call, using an address of operator.
let mutable dt2 = System.DateTime.Now
let b2 = System.DateTime.TryParse("12-20-04 12:21:00", &dt2)

printfn "%b %A" b2 dt2

Parametre dizileri

Bazen heterojen türündeki parametrelerde istenilen sayıda götüren bir işlev tanımlamak gereklidir. Tüm olası kullanılabilecek tüm türleri için hesap yöntemleri aşırı oluşturmak için pratik olmayacaktır. .net platform gibi yöntemler parametre dizisi özellikaracılığıyla destek sağlar. parametre dizisi içinde imza götüren bir yöntem bir rasgele sayıda parametre ile sağlanabilir. Parametreleri bir dizi içine yerleştirilir. Dizi öğelerini işlevgeçirilen parametre türlerini belirler. parametre dizisi ile tanımlarsanız, Object öğe türü olarak istemci kodu değerleri her türlü iletebilirsiniz.

F# parametre dizilerini yalnızca yöntemler tanımlanabilir. Tek başına işlevleri veya modüllerinde tanýmlanmýþ işlevleri kullanılamaz.

ParamArray öznitelikkullanılarak bir parametre dizisi tanımlayın. Yalnızca öznitelik olabilir ParamArray parametreson uygulanır.

Aşağıdaki kod iki arama gösterir bir.Değişen parametre dizisi ve bir tür tanımını f değişen parametre dizisi bir yöntem olan # net yöntem .

open System

type X() =
    member this.F([<ParamArray>] args: Object[]) =
        for arg in args do
            printfn "%A" arg

[<EntryPoint>]
let main _ =
    // call a .NET method that takes a parameter array, passing values of various types
    Console.WriteLine("a {0} {1} {2} {3} {4}", 1, 10.0, "Hello world", 1u, true)

    let xobj = new X()
    // call an F# method that takes a parameter array, passing values of various types
    xobj.F("a", 1, 10.0, "Hello world", 1u, true)
    0

projeçalıştırdığınızda, önceki kodun çıktısı aşağıdaki gibidir:

a 1 10 Hello world 1 True
"a"
1
10.0
"Hello world"
1u
true

Ayrıca bkz.

Diğer Kaynaklar

Üyeler (F#)