我理解除最后一行之外的所有内容。更具体地说是(:x y)部分。为什么指向10?也是为了确定...是y中的第一个元素应该指向整个事物(10和20)还是仅仅20?谢谢!
答案 0 :(得分:2)
在clojure中,:
作为前缀的符号为keywords。 Official docs。用作函数的关键字与get具有几乎相同的行为。因此(:x y)
的意图是(get y :x)
。
如果我们假设您的程序中有(deftype Double [x y])
未出现在此图片中,则表示在您的上一个表单中,您的Tripple类型的第二个元素是字段:x
或{{ Double .x
的1}},只是值y
。如果你想要,你可以在REPL上测试...
(Double. 10, 20)
答案 1 :(得分:1)
该图完全令人困惑。
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中的几乎所有基本数据结构一样(只有deftype
s作为一个例外),它是不可变的。
答案 2 :(得分:0)
它的共享结构!
(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。