Parametreler 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 İfadeleri (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