2013-08-24 4 views
7

私はJavaで、メソッドに引数としてオブジェクトを渡すと、メソッドは引数の変数が複製を作成するのではなく同じオブジェクトを指すようにします。 Clojureではいかがですか?たとえば:RDRが渡されたか、それはすでにとオープン結合によって作成されたものと同じRDRを指していたときにClojureでは引数の受け渡しはどのように機能しますか?

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

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

印刷からリーダーはメモリ内にRDRの別のコピーを作成していますか?

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

"ポインティング"や "インスタンス"などの悪い言い訳は申し訳ありませんが、私はClojureの初心者であり、まだそれを学んでいます。 :-)

答えて

5

ClojureはJavaと同じように値渡しです。私はそれを価値として渡すと考える。 Clojureがこのように動作するのは難しいことではありませんが、SchemeとCommon Lispは同じように動作します。

次の2つの参照がidentical?と同じメモリを指しているかどうかをテストすることができます。

(同じXY?)

テスト2つの引数は、あなたの答えのために

+0

(同じ?)はかなり便利に見える、今私は別のトリックを学んだ! :-) –

4

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 

barmの独自のコピーを作成した場合は、その後、printlnbar内で割り当てられた値を印刷しないでしょう。

+0

おかげで同じオブジェクトである場合同じように! :-D –

関連する問題