2

标题不是很好,但很难找到一个好的单行:)

问题如下。鉴于声明:

(def mystruct (create-struct :a :b :c))

是否可以通过以下方式构建实例(显然是类似的):

(struct-map mystruct :a 1 :b 2 :c (inc (:b this)))

我设法通过以下比扎罗方式得到了这样的东西:

(def mystructinst (struct-map mystruct :a 1 :b 2 :c (inc (:b mystructinst))))

但老实说,我不知道为什么会这样。我认为 mystructinst 仅在评估包含的表单后才绑定。这是执行此任务的一种干净方式吗?有没有更好的?

感谢您的时间。

4

1 回答 1

0

怎么样:

(let [b 2] (struct-map mystruct :a 1 :b b :c (inc b)))

您是正确的,该符号仅在使用时对包含的表单进行评估后才def绑定,这就是您的最后一个示例引发 NullPointerException 的原因。您可能在没有意识到的情况下在其他地方预定义了 mystructinst。您可以将要引用的变量移到外部struct-map并将其放在 a 中let。然后,它可以在任何地方访问。

另外,请注意,这let 确实允许您在后续绑定中引用以前的绑定:

user=> (let [a 1 b (inc a)] b)
2
于 2013-05-06T04:33:57.320 回答