Om.next:申请vs直接传递儿童

时间:2016-02-16 19:11:29

标签: javascript clojure clojurescript om

Om.next wiki中,有这样的示例代码(链接页面底部的代码列表):

(apply dom/ul nil
    (map person list))

由于dom/ul采用可变数量的参数,因此使用apply与此相比有什么好处:

(dom/ul nil (map person list))

第二种方法似乎更像是将数组作为children传递给支持的vanilla React。

实际问题(对评论的回应):apply是否必要?如果是这样,为什么后一种方法不起作用?如果没有,那么在示例中使用apply会带来什么好处?

2 个答案:

答案 0 :(得分:2)

dom/ul的ClojureScript签名显然与(defn ul [attrs & children] ...)类似。这里children是一个vararg。来电者可以传递0个或更多孩子。因此,以下调用有效:

(dom/ul nil (person jack))
(dom/ul nil (person jack) (person jill))
(dom/ul nil)

现在假设您有一组要包装在ul中的元素。该集合可能来自(map person list),它返回一系列元素。如果像(dom/ul nil (map person list))那样调用ul,则只有一个子参数传递给ul,并且类型错误。每个孩子都应该是一个元素,但是传递了一个元素集合。

apply救援。 apply的工作是处理我们有一组参数的情况,这些参数必须单独传递。因此,(dom/ul nil (person jack) (person jill))相当于(apply dom/ul nil (map person [jack jill]))。在这种情况下,apply是必要的,以确保将参数传递给ul,因为该函数期望它们。跳过apply不是一种选择。

答案 1 :(得分:1)

在Lisp中,您无法传递列表或集合来代替单个可变参数,并期望相同的行为。

如果你这样做,那么collection参数将被解释为所有可变参数中的第一个。要将集合作为函数参数进行传播,您必须使用apply