1

私はOCamlが初めてで、の概念を理解しようとしていmutable record fieldます。

レコードの配列を作成したいのですが、そのレコードにはブール型の可変フィールドが含まれています。だから私は次のようなことをしました:

type t = {i: int; mutable b: bool};;

レコードの「b」フィールドの値を変更できるようにしたいので、入れますmutable

let m = Array.make 10 ({i = 5; b = false});;

ここでは、配列の最初のインデックスにあるレコードのbフィールドを設定しようとしています。

(Array.get m 0).b <- true;;

問題は、私がやりたいことです。配列のすべてのレコードの「b」フィールドが設定されますが、これは私が望むものではありません。

同じレコードの可変フィールドは同じメモリ配置を共有していますか? 特定のレコードの「b」フィールドの値を変更するにはどうすればよいですか?

4

1 に答える 1

6

ドキュメントに記載されているように、Array.make要素がすべて物理的に等しい配列を作成します。これらの要素が不変である場合は問題ありませんが、ご覧のように、それらが可変である場合はそれを考慮する必要があります。

できることはArray.init、 を使用して、配列のセルごとに異なるオブジェクトを作成することです。

let m = Array.init 10 (fun _ -> {i = 5; b = false});;
于 2013-05-01T20:55:16.720 に答える