标题不是很好,但很难找到一个好的单行:)
问题如下。鉴于声明:
(def mystruct (create-struct :a :b :c))
是否可以通过以下方式构建实例(显然类似):
(struct-map mystruct :a 1 :b 2 :c (inc (:b this)))
我设法用以下的bizzaro方式得到这样的东西:
(def mystructinst (struct-map mystruct :a 1 :b 2 :c (inc (:b mystructinst))))
但说实话,我不知道为什么会这样。我认为mystructinst仅在评估包含的表单后绑定。这是执行此任务的一种干净方式吗?还有更好的吗?
感谢您的时间。
答案 0 :(得分:0)
如何:
(let [b 2] (struct-map mystruct :a 1 :b b :c (inc b)))
在使用def
评估包含的表单之后,符号仅绑定是正确的,这就是为什么您的上一个示例抛出NullPointerException。您可能在没有意识到的情况下在其他地方预定义了mystructinst。您可以移动要在struct-map
之外引用的变量,并将其放在let
中。然后,它可以在任何地方访问。
另请注意,let
允许您在后续绑定中引用先前的绑定:
user=> (let [a 1 b (inc a)] b)
2