
除了最后一行我什么都懂。更具体地说,(:x )部分。为什么指向10?也只是为了确定..。Y中的第一个元素应该指向整个事物(10和20)还是只指向20?谢谢!
发布于 2014-10-10 15:29:21
在clojure中,以:作为前缀的符号是关键词。官方文件。关键字作为函数使用时,其行为与到达几乎相同。因此,(:x y)的目的是(get y :x)。
如果我们假设您的程序中有一个没有出现在这个映像中的(deftype Double [x y]),这意味着在最后一个表单中,您的三重类型的第二个元素是双y的字段:x或.x,它只是值(Double. 10, 20)。你可以在REPL上测试这个如果你想..。
user> (defrecord MyDouble [x y])
user.MyDouble
user> (defrecord MyTripple [x y z])
user.MyTripple
user> (def x (MyDouble. 10 20))
#'user/x
user> (def y (MyDouble. x 40))
#'user/y
user> (def z (MyTripple. x (:x y) y))
#'user/z
user> z
#user.MyTripple{:x #user.MyDouble{:x 10, :y 20}, :y #user.MyDouble{:x 10, :y 20}, :z #user.MyDouble{:x #user.MyDouble{:x 10, :y 20}, :y 40}}
user> (:x y)
#user.MyDouble{:x 10, :y 20}发布于 2014-10-10 16:31:51
这张图完全令人困惑。
x用于两种截然不同的事情:
Double和Double的字段的名称。假设x是Double的第一个字段的名称,
(def y (MyDouble. x 40))然后
(def z (Triple. x (:x y) y))..。等于
(def z (Triple. x x y))因此,指向Double{:x 10, :y 20}的两个箭头是全局x的值(假设另一个字段名为y)。
把这些引用看作指针是很少有帮助的。记录,就像Clojure中几乎所有的基本数据结构一样(只有S弹簧作为一个例外)是不可变的。
发布于 2014-10-10 16:13:16
这是共享结构!
(defrecord MyDouble [x y]) ;; (defrecord Double [x y]) produces an exception
(defrecord Triple [a b c])
(def x (MyDouble. 10 20))这将创建一个新的MyDouble记录,其值为10和20。(:x x) => 10,(:y x) => 20。
(def y (MyDouble. x 40))这将创建一个新的MyDouble记录。它的第一个值是x在那个时刻的值,即#user.MyDouble{:x 10, :y 30}。和40。也就是说,y有一个值:#user.MyDouble{:x #user.MyDouble{:x 10, :y 20}, :y 40}。
(def z (Triple. x (:x y) y))这将创建一个新的Triple。对象。与前一行一样,第一个值是#user.MyDouble{:x 10, :y 30}。第二个值是表达式(:x y)的值。
user=> (:x #user.MyDouble{:x #user.MyDouble{:x 10, :y 20}, :y 40})
#user.MyDouble{:x 10, :y 20}所以第二个值也是#user.MyDouble{:x 10, :y 20}。第三个值是y或#user.MyDouble{:x #user.MyDouble{:x 10, :y 20}, :y 40}的值。
因此,打印出来的z是:
#user.Triple{:a #user.Mydouble{:x 10, :y 20},
:b #user.Mydouble{:x 10, :y 20},
:c #user.Mydouble{:x #user.Mydouble{:x 10, :y 20},
:y 40}}图中显示的是这里有很多共享结构。您在#user.Mydouble{:x 10, :y 20},中看到的三次重复的z实际上是完全相同的对象,而不是三个副本。所以是的,在回答你的最后一个问题时,箭头指向了整个物体,而不仅仅是数字20。
https://stackoverflow.com/questions/26302578
复制相似问题