在Om.next维基中,有这样的示例代码(链接页面底部的代码列表):
(apply dom/ul nil
(map person list))由于dom/ul使用可变数量的参数,所以使用apply与以下方法相比有什么好处:
(dom/ul nil (map person list))第二种方法似乎更类似于在vanilla中传递children的数组,这是支持的。
实际问题(对评论的答复):apply是否必要?如果是的话,为什么后一种方法不起作用?如果没有,那么像在示例中一样使用apply会带来什么好处?
发布于 2016-02-16 22:58:12
显然,ClojureScript的dom/ul签名类似于(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),它返回一系列元素。如果ul像(dom/ul nil (map person list))一样被调用,那么只有一个子参数被传递给ul,而且它的类型是错误的。每个子元素都应该是一个元素,但是元素的集合将被传递进来。
apply去营救。apply的工作是处理我们有一个参数集合的情况,这些参数必须单独传入。因此,(dom/ul nil (person jack) (person jill))等同于(apply dom/ul nil (map person [jack jill]))。在本例中,apply是必要的,以确保将参数传递给ul,因为该函数正在期待它们。跳过apply不是一种选择。
发布于 2016-02-17 00:36:51
在Lisp中,您不能传递一个列表或集合来代替单个的变量参数,并期望得到相同的行为。
如果这样做,集合参数将首先被解释为变量参数。要将集合扩展为函数参数,必须使用apply。
https://stackoverflow.com/questions/35441082
复制相似问题