2015-12-13 5 views
5

Kann der Grund für ein solches Verhalten nicht verstehen:Arrays ist und gezackten Array

let example count = 
    let arr = Array.create 2 (Array.zeroCreate count) 
    for i in [0..count - 1] do 
     arr.[0].[i] <- 1 
     arr.[1].[i] <- 2 
    arr 

example 2 |> Array.iter(printfn "%A") 

Druck:

[|2; 2|] 
[|2; 2|] 

https://dotnetfiddle.net/borMmO

Wenn ich ersetzen:

let arr = Array.create 2 (Array.zeroCreate count) 

zu:

let arr = Array.init 2 (fun _ -> Array.zeroCreate count) 

Alles wird wie erwartet:

let example count = 
    let arr = Array.init 2 (fun _ -> Array.zeroCreate count) 
    for i in [0..count - 1] do 
     arr.[0].[i] <- 1 
     arr.[1].[i] <- 2 
    arr 

example 2 |> Array.iter(printfn "%A") 

Druck:

[|1; 1|] 
[|2; 2|] 

https://dotnetfiddle.net/uXmlbn

Ich glaube, der Grund dafür ist die Tatsache, dass das Array - ein Referenz-Typ. Aber ich möchte verstehen, warum das passiert. Da habe ich solche Ergebnisse nicht erwartet.

Antwort

9

Wenn Sie schreiben:

let arr = Array.create 2 (Array.zeroCreate count) 

Sie sind ein Array zu schaffen, wobei jedes Element ein Verweis auf ist das gleiche Array. Dies bedeutet, dass das Mutieren eines Werts mit arr.[0] auch den Wert in arr.[1] mutiert - weil die beiden Array-Elemente auf dasselbe veränderbare Array zeigen. Sie am Ende mit:

[| x ; x |] 
    \/
[| 0; 0 |] 

Wenn Sie schreiben:

let arr = Array.init 2 (fun _ -> Array.zeroCreate count) 

Die bereitgestellte Funktion für jede Position in dem arr Array genannt wird, und so werden Sie mit verschiedenen Array für jedes Element am Ende (und so arr.[0] <> arr.[1]). Sie am Ende mit:

 [| x ; y |] 
    /  \ 
[| 0; 0 |] [| 0; 0 |] 
+0

Danke. Ich dachte so etwas, aber es war nicht offensichtlich für mich =) Jetzt verstehe ich. –

Verwandte Themen