9

Java では、オブジェクトを引数としてメソッドに渡すと、メソッドは引数変数が複製を作成するのではなく、同じオブジェクトを指すようにすることを知っています。Clojureではどうですか?例えば:

(defn print-from-reader [rdr]
   (print (.read rdr)))

(...inside some code...
  (with-open [rdr (Reader file)]
    (print-from-rader rdr)))

print-from-reader は、rdr が渡されたときにメモリ内に rdr の別のコピーを作成しますか、それとも with-open バインディングによって既に作成されている同じ rdr を指していますか?

2 つの clojure インスタンスが同じメモリを指しているかどうかを確認する方法はありますか?

「指している」や「インスタンス」などの悪い言葉で申し訳ありません。私は Clojure の初心者であり、まだ学習中です。:-)

4

2 に答える 2

7

this question on google groupsへの回答によると、値渡しです。

Clojure は Java から引数渡しのセマンティクスを継承しています。したがって、渡される値がオブジェクト参照である値渡しです。さらに、プリミティブ型の値を渡すことを可能にする最適化機能があります。

そのため、関数はパラメーターが渡されたときにコピーを作成しません。rdrあなたのコードでは同じインスタンスになります。

Java の相互運用性のために、そのように実装することは理にかなっています。そうしないと、そのメソッドで Java オブジェクトの状態を (簡単に) 変更できませんでした。

簡単にテストできます:

(import 'java.util.HashMap)
(def m (new HashMap))
(defn foo [m] (defn bar [m] (.put m "testkey" "testvalue")) (bar m) (println (get m "testkey")))

(foo m)

結果:

testvalue
nil

barの独自のコピーを作成した場合mprintlnは内部で割り当てられた値を出力しませんbar

于 2013-08-24T01:05:38.747 に答える
6

Clojure は Java と同じように値渡しです。参照は値渡しだと思います。Clojure がこのように機能するのは無理なことではありません。Scheme と Common Lisp は同じように動作します。

次のコマンドを使用して、2 つの参照が同じメモリを指しているかどうかをテストできますidentical?

(同一?xy)

2 つの引数が同じオブジェクトかどうかをテストします

于 2013-08-24T01:25:40.540 に答える