_评论者:michalmarczyk_
@Stuart
下面是一个码片段,在Clojure 1.6 REPL中评估后,又在Clojure 1.7 REPL中评估,两个REPL都刚刚启动,结果不同。
Clojure 1.6.0
(let [foo 1 bar 2
{:keys [foo bar]
:or {foo 3 bar (inc foo)}} {}]
[foo bar])
[3 2]
Clojure 1.7.0
(let [foo 1 bar 2
{:keys [foo bar]
:or {foo 3 bar (inc foo)}} {}]
[foo bar])
[3 4]
文档中并未承诺{{:or}}和{{:keys}}之间不会有意外的交互,但如上所示,依赖1.6行为的任何现有代码在1.7版本中已被破坏。指定并坚持某些行为将防止未来出现此类惊喜。
我还认为,当前的行为在“随机”的意义上,没有任何原则上的原因可以解释为什么有人会期望它——因此我提出了在补丁中实现的将{{:or}}默认值指定为包围作用域的建议。