繁体   English   中英

参数如何在Clojure中传递?

[英]How does argument passing work in Clojure?

我知道在Java中,如果我将一个对象作为参数传递给一个方法,那么该方法将让参数变量指向同一个对象而不是重复。 在Clojure怎么样? 例如:

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

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

当传入rdr时,print-from-reader是否会在内存中创建另一个rdr副本,或者它指向已经通过with-open绑定创建的相同rdr?

有没有办法检查两个clojure实例是否指向相同的内存?

抱歉我的错误条款,如“指向”和“实例”,我是Clojure的新手,仍在学习它。 :-)

根据谷歌集团这个问题的回答, 它是值得传递的。

Clojure继承了Java中的参数传递语义。 所以它是pass-by-value,其中传递的值是对象引用。 此外,还有一些优化工具可以传递原始类型的值。

因此,在传递参数时,函数不会复制。 代码中的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创建了自己的m副本,则println将不会打印在bar指定的值。

Clojure就像Java一样传递价值。 我认为它是,引用是通过值传递的。 Clojure不像这样工作,Scheme和Common Lisp的行为方式相同。

您可以测试两个引用是否指向相同的内存identical?

(相同?xy)

测试2个参数是否是同一个对象

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM