2024 年 Clojure 状况调查中分享你的想法!

欢迎!请查看 关于 页面以了解此工作方式的更多详细信息。

0 投票
ClojureScript

当使用模式和方法调用 clojure.core/replace 时,Clojurescript 版本将委托给 Javascript 的 s.replace 方法,该方法根据你的模式中有多少匹配组调用该函数并传递可变数量的参数。Clojure 版本始终使用单个参数调用它,如果你在模式中有匹配组,这可能是向量。

我不确定这是否是有意的。如果不是,我认为可以通过使用 re-find 来修复这种差异,re-find 似乎返回与 Clojure 中相同的字符串或向量。如果是出于性能原因而故意这样做,也许文档字符串应该更新以指出这一点,因为没有警告函数被调用时传递了过多的参数。

3 答案

0 投票

评论由:cgag 发布

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

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

将记录:"Match: hello world"

CLJ
user=> (clojure.string/replace "hello world" #"(hello) world" (fn (link: m) (println (str "Match: " m) m)))
Match: (link: "hello world" "hello") (link: 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 "匹配: " m) m))) 匹配: ["hello world" "hello"] [hello world hello] "null"

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