2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面了解有关如何操作的更多信息。

+3
ClojureScript
重新发布

我偶然发现了这个问题

Clojure
(get {:x (reduced 10)} :x)
=> #object[clojure.lang.Reduced 0x28494b99 {:status :ready, :val 10}]

(get-in {:x (reduced 10)} [:x])
=> #object[clojure.lang.Reduced 0x28494b99 {:status :ready, :val 10}]

ClojureScript
(get {:x (reduced 10)} :x)
=> #object[cljs.core.Reduced] ; 与 Clojure 相同的行为
(get-in {:x (reduced 10)} [:x])
=> 10

因此,似乎 get-in 在 ClojureScript 中会自动 deref reduced 值?

1 答案

0

CLJS 中 get-in 的实现使用默认情况下的 reduce,这意味着当找到 reduced 对象时,它会被 reduce 逻辑解包。如果这导致错误,则可以通过向 get-in 提供 not-found 值作为临时解决方案,这将使用与 Clojure 相同的逻辑。我认为向 CLJS 团队提交一个修复这个问题的请求是合理的。


重新显示
很好,谢谢。
我想可能还有其他上下文使用 reduce 处理数据。因此,可能无法依赖 `reduced` 值在函数调用中 "存活" 呢?
...