每http://www.assembla.com/spaces/clojure/wiki/Datatypes
我应该可以在lein回复中键入以下内容:
(deftype Bar [a b c d e])
(def b(Bar 1 2 3 4 5))
然而,当我这样做时,我得到以下输出:
java.lang.Exception:期望var,但Bar被映射到类user.Bar(NO_SOURCE_FILE:31)
我很困惑,并且是一个完整的新手,所有的帮助都值得赞赏!
注意:在标准的clojure repl中尝试相同的代码并遇到同样的问题。
答案:嗯,我通过一些额外的搜索回答了我自己的问题。事实证明样本很糟糕。实例化Bar的正确方法是:(def b(Bar.1 2 3 4 5))
。在Bar结束时,这种用法很重要。仍然不太明白为什么(因此,如果你有时间,请告知专家请详细说明,因为我想知道细节;))。
谢谢大家!
答案 0 :(得分:3)
我对deftype
并不熟悉,但从我看到你需要一个实例化类型的点,试试这个:
(deftype Bar [a b c d e])
(def b (Bar. 1 2 3 4 5))
请注意,它不是Bar
,而是Bar.
。见例子,例如这里:
(new foo ...)
代替(foo. ...)
)这个帖子似乎表明这是deftype
:
或者,换句话说,您链接到的页面上的文档似乎已过时。
希望这有帮助。
答案 1 :(得分:2)
有两种方法可以实现您的目标。首先,我们来看看deftype
示例。
user=> (deftype Bar [a b c d e])
user.Bar
user=> (def b (Bar. 1 2 3 4 5))
#'user/b
user=> (:a b)
nil
user=> (.a b)
1
这里你会注意到一些事情。如前所述,你需要“。”实例化你的类型。此外,您不会获得关键字访问权限(“:”表示法),只能访问字段(再次使用“。”)。
另一种方法是使用defrecord
定义记录:
user=> (defrecord Bar [a b c d e])
user.Bar
user=> (def b (Bar. 1 3 5 7 9))
#'user/b
user=> (:a b)
1
user=> (.a b)
1
这为您提供了字段和关键字访问权限。如果您决定让其中一个字段包含另一个记录,则此访问很容易嵌套。