在Om.next wiki中,有这样的示例代码(链接页面底部的代码列表):
(apply dom/ul nil
(map person list))
由于dom/ul
采用可变数量的参数,因此使用apply
与此相比有什么好处:
(dom/ul nil (map person list))
第二种方法似乎更像是将数组作为children
传递给支持的vanilla React。
实际问题(对评论的回应):apply
是否必要?如果是这样,为什么后一种方法不起作用?如果没有,那么在示例中使用apply
会带来什么好处?
答案 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
。