2017-03-16 12 views
1

私がこれまで見てきたことから、可変フィールドを持つレコードは、あたかも参照によって渡されたかのように振る舞います。たとえば、レコードを関数に渡すか、データ構造に格納すると、レコードはそのプロセスでコピーされません。たとえば、このコード:変更可能なフィールドを持つレコードは、常に「参照渡し」ですか?

type t = { 
    mutable t_val: int 
} 

let() = 
    let ht = Hashtbl.create 16 in 
    let x = { t_val = 42 } in 
    Hashtbl.replace ht "x" x; 
    x.t_val <- 43; 
    let x2 = Hashtbl.find ht "x" in 
    Format.printf "x.t_val: %d, x2.t_val: %[email protected]" x.t_val x2.t_val 

出力

x.t_val: 43, x2.t_val: 43 

これは信頼性や行動を意図や状況に依存しますか?

答えて

1

はい、信頼性が高く、意図しています。実際には、変更可能なレコードは「参照渡し」だけでなく、すべてが存在します。不変のデータでのみ、あなたはその違いに気付かないでしょう。 (例外はありますが、intのような小さな不変のデータは、値渡しの方法で処理するように最適化されていますが、意味的には一貫して渡されたものとみなしても安全です)。

0

これは、値渡しまたは参照渡しとは関係ありません。たとえば、Javaは値渡しのみを持ち、参照を渡すと、関数内で参照によって指されるオブジェクトのフィールドを変更することもできます。これらの変更は、参照を持つ他の誰でも見ることができますオブジェクト。

(値渡しと参照渡しの違いは、直接をパラメータ変数(ファンクション内に指し示されたオブジェクトにアクセスしない)に割り当てると、値渡しでは呼び出し元のスコープ内の渡された変数には影響を与えません;参照渡しでは、呼び出し元のスコープ内の渡された変数への代入と同じ効果があります。初期化後に変数に直接代入する(これを行うための構文がないため)、値渡しと参照渡しの間に違いはありません。

あなたの話はそのレコードタイプは参照タイプ、すなわちレコードの値ですタイプは実際には基礎となる構造への参照であり、複数の参照は同じ基本構造を指すことができ、ある参照による変更は同じ基本構造への他の参照を通して見ることができる。これは本当です。 OCamlの "ボックス化"されていない唯一の型、つまり参照型は、intのような単純な不変型またはintに収まるものだけです。不変なので、ほとんど違いはありません参照型または値型(おそらく==のようなもののセマンティクスを除く)。

関連する問題