Aracılığıyla paylaş


Hücrelere başvurma (F#)

Hücre başvurusu başvuru semantiği ile kesilebilir değerler yaratmak etkinleştirme depolama konumları.

ref expression

Notlar

Kullandığınız ref , değeri içeren yeni bir başvuru hücre oluşturmak için önce bir değer işleci. Kesilebilir, çünkü ona temel olan değeri daha sonra değiştirebilirsiniz.

Başvuru bir hücre, gerçek bir değeri tutan; yalnızca bir adres değil. Kullanarak, bir başvuru hücre oluşturduğunuzda ref işleci, kapsüllenmiş kesilebilir bir değer olarak ona temel olan değeri bir kopyasını oluşturun.

Başvuru bir hücre kullanarak başvuru ! (bang) işleci.

Aşağıdaki kod örneği, bildirim ve hücrelere başvurma kullanımını göstermektedir.

// Declare a reference.
let refVar = ref 6

// Change the value referred to by the reference.
refVar := 50

// Dereference by using the ! operator.
printfn "%d" !refVar

Çıkış 50.

Hücrelere başvurma örnekleri olan Ref gibi bildirilen genel kayıt türü.

type Ref<'a> =
    { mutable contents: 'a }

Tür 'a ref eşanlamlıdır Ref<'a>. Bu yazıda eski derleyici ve IDE içindeki IntelliSense görüntülenir ancak alttaki tanımıdır ikincisi.

ref İşleci yeni başvuru hücre oluşturur. Aşağıdaki kod, bir bildirimdir ref işleci.

let ref x = { contents = x }

Aşağıdaki tabloda başvuru hücre özellikleri gösterir.

Operatör, üye ya da alan

Description

Tür

Tanım

!(başvuru işleci)

Ona temel olan değeri döndürür.

'a ref -> 'a

let (!) r = r.contents

:=(atama işleci)

Temel alan değeri değiştirir.

'a ref -> 'a -> unit

let (:=) r x = r.contents <- x

ref(işleç)

Yeni bir başvuru hücresine bir değer saklar.

'a -> 'a ref

let ref x = { contents = x }

Value(özellik)

Alır veya ona temel olan değeri ayarlar.

unit -> 'a

member x.Value = x.contents

contents(kayıt alanı)

Alır veya ona temel olan değeri ayarlar.

'a

let ref x = { contents = x }

Temel alınan değer erişmek için çeşitli yolları vardır. Başvuru operatörü tarafından döndürülen değeri (!) atanabilir bir değer değil. Bu nedenle, ona temel olan değeri değiştiriyorsanız, atama işleci kullanmanız gerekir (:=) onun yerine.

Her iki Value özelliği ve contents alanı olan değerler atanabilir. Bu nedenle, bunlar erişmek veya temel değeri değiştirmek için aşağıdaki kodda gösterildiği gibi kullanabilirsiniz.

let xRef : int ref = ref 10

printfn "%d" (xRef.Value)
printfn "%d" (xRef.contents)

xRef.Value <- 11
printfn "%d" (xRef.Value)
xRef.contents <- 12
printfn "%d" (xRef.contents)

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

10
10
11
12

Alan contents ML'ın diğer sürümleri ile uyumluluk için sağlanır ve derleme sırasında uyarı üretecektir. Uyarıyı devre dışı bırakmak için --mlcompatibility derleyici seçeneği. Daha fazla bilgi için bkz. Derleme Seçenekleri (F#).

Örnek

Aşağıdaki kod, parametre geçirmenin hücrelere başvuru kullanımını göstermektedir. Incrementor Türünde bir yöntem Increment içeren bir parametre alır byref parametre türü. byref Arayanlar başvuru hücre veya belirtilen türde tipik bir değişkenin adresi bu durumda geçmesi türü parametresinde gösterir int. Kalan kod çağırmak verilmektedir Increment bu tür bağımsız değişkenleri, her ikisini de içeren ve kullanımını gösterir ref başvuru hücre oluşturmak için bir değişken işletmeni (ref myDelta1). Daha sonra adres, işleç kullanımını gösterir (&) uygun bir değişken oluşturmak için. Son olarak, Increment yöntemi çağrılır yeniden kullanılarak bildirilmiş bir başvuru hücre kullanarak bir let bağlama. Kodun son satırı kullanımını gösterir ! yazdırma için başvuru hücre başvuru işleci.

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

let incrementor = new Incrementor(1)
let mutable myDelta1 = 10
incrementor.Increment(ref myDelta1)
// Prints 10:
printfn "%d" myDelta1  

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

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

Başvuruya göre geçiren hakkında daha fazla bilgi için bkz: Parametreleri ve bağımsız değişkenler (F#).

Not

C# programcıları, bilmeniz ref C# [NULL]'ta sakladığından farklı F# çalışır.Örneğin, kullanımı ref geçirdiğinizde, C# gibi bir bağımsız değişken aynı etkiyi F# yok.

Başvuru hücre vs.Kesilebilir değişkenleri

Hücrelere başvurma ve kesilebilir değişkenler genellikle aynı durumlarda kullanılabilir. Ancak, kesilebilir değişkenler kullanılamaz ve başvuru hücre yerine kullanmak bazı durumlar vardır. Genel olarak, burada bunlar derleyici tarafından kabul edilen kesilebilir değişkenler tercih etmelisiniz. Ancak, kapanışları oluşturmak ifadelerde kesilebilir değişkenlerini kullanamazsınız derleyici bildirir. Kapanışları lambda ifadeleri, sıra ifadeleri hesaplama ifadeleri gibi belirli F# ifadeler, tarafından oluşturulan yerel işlevler olduğu ve kısmen kullanan curried İşlevler, bağımsız değişkenler uygulanan. Bu deyimler tarafından üretilen kapanışları, sonraki değerlendirme için saklanır. Bu işlemi kesilebilir değişkenleri ile uyumlu değildir. Böyle bir ifade kesilebilir durumda gerekiyorsa, bu nedenle, hücrelere başvurma kullanmak zorunda. Kapanışları hakkında daha fazla bilgi için bkz: kapanışları (F#).

Aşağıdaki kod örneği, başvuru hücre kullanmalısınız senaryosu gösterilmektedir.

// Print all the lines read in from the console.
let PrintLines1() =
    let mutable finished = false
    while not finished do
        match System.Console.ReadLine() with
        | null -> finished <- true
        | s -> printfn "line is: %s" s


// Attempt to wrap the printing loop into a 
// sequence expression to delay the computation.
let PrintLines2() =
    seq {
        let mutable finished = false
        // Compiler error:
        while not finished do  
            match System.Console.ReadLine() with
            | null -> finished <- true
            | s -> yield s
    }

// You must use a reference cell instead.
let PrintLines3() =
    seq {
        let finished = ref false
        while not !finished do
            match System.Console.ReadLine() with
            | null -> finished := true
            | s -> yield s
    }

Önceki kodda, başvuru hücre finished bulunan yerel durumda, diğer bir deyişle kapanışın değişkenler oluşturulur ve tamamen deyim içinde kullanılan bu sıra ifade durumda. Yerel olmayan değişkenler ne olacağı göz önünde bulundurun. Kapanışları de yerel olmayan durumu erişebilirsiniz, ancak böyle bir durumda değişkenleri kopyalanır ve değeri depolanır. Bu işlem olarak bilinen değeri semantiği. Başka bir deyişle, kopyanın zaman değerleri saklanır ve değişkenleri yapılan sonraki değişiklikler değil yansıtılır. Yerel olmayan değişken veya diğer değişiklikleri izlemek isterseniz, sözcükleri kullanarak yerel olmayan durumu ile kurduğu kapanışı gerekiyorsa başvuru semantiği, başvuru bir hücre kullanmanız gerekir.

Aşağıdaki kod örnekleri kapanışları hücrelere başvuru kullanımını göstermektedir. Bu durumda, kapanışı fonksiyon bağımsız değişkenleri kısmi uygulamasından oluşur.

// The following code demonstrates the use of reference
// cells to enable partially applied arguments to be changed
// by later code.

let increment1 delta number = number + delta

let mutable myMutableIncrement = 10

// Closures created by partial application and literals.
let incrementBy1 = increment1 1
let incrementBy2 = increment1 2

// Partial application of one argument from a mutable variable.
let incrementMutable = increment1 myMutableIncrement

myMutableIncrement <- 12

// This line prints 110.
printfn "%d" (incrementMutable 100)

let myRefIncrement = ref 10

// Partial application of one argument, dereferenced
// from a reference cell.
let incrementRef = increment1 !myRefIncrement

myRefIncrement := 12

// This line also prints 110.
printfn "%d" (incrementRef 100)

// Reset the value of the reference cell.
myRefIncrement := 10

// New increment function takes a reference cell.
let increment2 delta number = number + !delta

// Partial application of one argument, passing a reference cell
// without dereferencing first.
let incrementRef2 = increment2 myRefIncrement

myRefIncrement := 12

// This line prints 112.
printfn "%d" (incrementRef2 100)

Ayrıca bkz.

Başvuru

Sembol ve işleç başvurusu (F#)

Kavramlar

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

Diğer Kaynaklar

F# dil başvurusu