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`值在函数调用中“存活”吧?
...