_评论者: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}} 默认值指向封装作用域的建议。