2011-05-31 4 views
1

の配列を次のコードで初期化します。配列A = Bの配列はありますか?f#:配列

let A = Array.init 3 (fun _ -> Array.init 2 (fun _ -> 0)) 
let defaultCreate n defaultValue = Array.init n (fun _ -> defaultValue) 
let B = defaultCreate 3 (defaultCreate 2 0) 

A and Bに値を割り当てると、それはどうなりますか?ありがとう。

for i = 0 to 2 do 
    for j = 0 to 1 do 
      A.[i].[j] <-i + j 
      B.[i].[j] <-i + j 
printfn "%A vs %A" A B 

A = [|[|0; 1|]; [|1; 2|]; [|2; 3|]|] and B = [|[|2; 3|]; [|2; 3|]; [|2; 3|]|] 

答えて

0

これらは同じではありません。

配列は参照型であり、ヒープに格納されます。別の配列をデフォルト値として使用して配列を作成すると、同じ配列への参照が繰り返し格納されます。

数値は別のものです。それらは不変であり、値によってスタックに格納されます。したがって、1の値を1以外に変更することはできません。

「ジグザグ」アレイを作成するには、Array.initをイニシャライザから最初のArray.initコールにコールして、各スロットに新しいアレイを作成する必要があります。

また、すべてのスロットに同じ値を設定したい場合はArray.createを使用できます。しかし、参照型については注意してください。

let A = Array.init 3 (fun _ -> Array.create 2 0) 
+0

'System.Int32'のような' ValueType'sは、必ずしも "スタックに格納される"わけではありません。 –

+0

@Stephen - 真。ボックス化することも、参照型でラップすることもできます。しかし、それをスタックに格納することは、参照型とは別に設定します。 –

+2

値*セマンティクス*は、参照型とは別に値型を設定するものです。それらが通常スタックに格納されるという事実は実装の詳細です。 – ildjarn

3
let B = defaultCreate 3 (defaultCreate 2 0) 

あなたは配列を作成し、その後、各セルの値として、この配列を使用します。

let a = [|1; 2; 3; 4|] 
let b = [|a; a; a; a|] 

同じ配列aは、セル毎に使用されている(aへのポインタは、あなたがCに慣れていると思い):あなたはこのような何かをしたかのよう それはです。したがって、b.[0].[1]の変更は、a.[1]ごとに変更されます。私のサンプルで

> b.[0].[1] <- 10;; 
val it : unit =() 

> b;; 
[|[|1; 10; 3; 4|]; [|1; 10; 3; 4|]; [|1; 10; 3; 4|]; [|1; 10; 3; 4|]|] 

同じことがあなたのコードで発生します。

関連する問題