Pointers 图表中特定部分的说明
Pointers 图表中特定部分的说明,pointers,clojure,Pointers,Clojure,除了最后一行,我什么都懂。更具体地说是(:x y)部分。为什么指向10?也只是为了确定。。。y中的第一个元素应该指向整个东西(10和20),还是仅仅指向20?谢谢大家! 在clojure中,前缀为:的符号是。关键字用作函数时,其行为与函数几乎相同。所以(:xy)的意图是(get y:x) 如果我们假设在您的程序中有一个(deftype Double[xy])未出现在此图像中,这意味着在您的最后一个表单中,Triple类型的第二个元素是Double的字段:x或.x,即Double(Double.1
除了最后一行,我什么都懂。更具体地说是(:x y)部分。为什么指向10?也只是为了确定。。。y中的第一个元素应该指向整个东西(10和20),还是仅仅指向20?谢谢大家! 在clojure中,前缀为
:
的符号是。关键字用作函数时,其行为与函数几乎相同。所以(:xy)
的意图是(get y:x)
如果我们假设在您的程序中有一个(deftype Double[xy])
未出现在此图像中,这意味着在您的最后一个表单中,Triple类型的第二个元素是Double的字段:x
或.x
,即Double(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}
这是共享结构强>
(defrecord MyDouble[x y]);;(defrecord Double[x y])生成异常
(三重记录[a b c])
(def x(MyDouble.10 20))
这将创建一个新的MyDouble
记录,其值为10
和20
<代码>(:x)
=>10,(:yx)
=>20
(定义y(MyDouble.x 40))
这将创建一个新的MyDouble
记录。它的第一个值是x
当时的值,即#user.MyDouble{:x10,:y30}
。和40
。也就是说,y
的值为:#user.MyDouble{:x#user.MyDouble{:x10,:y20},:y40}
(定义z(三重x(:x y)y))
这将创建一个新的三元组。对象与前一行一样,第一个值是#user.MyDouble{:x10,:y30}
。第二个值是表达式(:x y)
的值:
user=>(:x#user.MyDouble{:x#user.MyDouble{:x10,:y20},:y40})
#user.MyDouble{:x10,:y20}
所以第二个值也是#user.MyDouble{:x10,:y20}
。第三个值是y
或#user.MyDouble{:x#user.MyDouble{:x10,:y20},:y40}
的值
所以打印出来的z
,是:
#user.Triple{:a#user.Mydouble{:x10,:y20},
:b#user.Mydouble{:x10,:y20},
:c#user.Mydouble{:x#user.Mydouble{:x10,:y20},
:y 40}
图中显示的是这里有很多共享结构。实际上,您在z
中看到的#user.Mydouble{:x10,:y20},
重复了三次,它是完全相同的对象,而不是三个副本。因此,是的,在回答你的最后一个问题时,箭头指向的是整个问题,而不仅仅是数字20。这个图表完全令人困惑
x
用于两种不同的用途:
- 双精度
记录类型的符号
- 类型为
Double
的字段的名称李>
假设x
是Double
的第一个字段的名称,给定
(def y (MyDouble. x 40))
然后
。。。相当于
(def z (Triple. x x y))
因此,两个箭头指向全局x
(假设另一个字段名为y
)的双{:x10,:y20}
<> p>并且很少考虑将这些引用作为指针。记录,就像Clojure中几乎所有的基本数据结构一样(只有spring例外),是不可变的 如果没有Double
的定义,这是不明确的。Double
中的第一个插槽是否称为x
?此图从何而来?
(def z (Triple. x x y))