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

欢迎!请查阅关于页面以了解此页面如何工作。

0
ClojureScript

当使用模式和一个函数调用 clojure.core/replace 时,ClojureScript 版本会委托给 JavaScript 的 s.replace 方法,该方法根据模式中匹配组的数量调用函数,传递不同数量的参数。Clojure 版本始终以单个参数调用它,如果模式中有匹配组,则该参数可能是一个向量。

我不确定这是否是有意的。如果这不是故意的,我认为可以通过使用 re-find 来修复这个差异,因为这看起来返回的字符串或向量与 Clojure 中得到的相同。如果是出于性能原因而故意这样设计,则或许文档字符串应该更新以说明这一点,因为没有警告表明函数使用过多的参数。

3 个答案

0

评论者:cgag

恐怕我不知道如何编辑,但我想要包括一个简单的示例

CLJS
(clojure.string/replace "hello world" #"(hello) world" (fn ([m]) (.log js/console (str "Match: " m)) m))

将记录:"Match: hello world"

CLJ
user=> (clojure.string/replace "hello world" #"(hello) world" (fn ([m]) (println (str "Match: " m) m)))
Match: ("hello world" "hello") ("hello world" "hello")

NullPointerException java.util.regex.Matcher.quoteReplacement (Matcher.java:655)

0

评论者:mfikes

也许这在 ClojureScript 1.9.946 中已经被解决了。

cljs.user=> (clojure.string/replace "hello world" #"(hello) world" (fn [m] (println (str "Match: " m) m))) Match: ["hello world" "hello"] [hello world hello] "null"

0
参考: https://clojure.atlassian.net/browse/CLJS-746(由 alex+import 报告)
...