在 Clojurescript 中,如何将集合的元素作为参数传递给变量 arity Javascript 函数?



这是按我所期望的方式来安慰的:

(.log js/console "hi" "there")

输出为

hi there

但是,这只会给控制台写一个大混乱:

(defn log-it [& args] (.log js/console args))
(log-it "hello" "there")

输出为:

c…s.c…e.IndexedSeq {arr: Array[2], i: 0, meta: null, cljs$lang$protocol_mask$partition0$: 166592766, cljs$lang$protocol_mask$partition1$: 8192}

这也行不通:

(apply .log js/console ["hi" "there"])

有没有办法将向量的元素传递到.log函数中?我是否必须写一个宏才能将矢量加入'(.log js/console)

这里的问题是,您正在尝试记录 args的值(这是一个clojure indexedSeq),而不是作为单个参数传递SEQ中的值。在这种情况下,您需要使用apply(或将该序列转换为本机数据结构)。

如果您查看apply的签名,您的另一个示例不起作用。

(apply f args)

它希望第一个参数是您要调用的函数,但是在这里,第一个参数是.log

(apply .log js/console ["hi" "there"])

请记住,.log js/console是在console上调用log方法的语法。相反,我们想获得对console.log函数的引用。

(apply (.-log js/console) args)

我们使用.-log读取.log属性,而不是将其称为方法。然后,我们将其与args序列一起传递。

因此,您可以将原始函数定义为:

(defn log-it
  [& args]
  (apply (.-log js/console) args))

,或者如果您想变得更聪明。

(def log-it (partial (.-log js/console)))

最新更新