首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Om.next:应用vs直接通过儿童

Om.next:应用vs直接通过儿童
EN

Stack Overflow用户
提问于 2016-02-16 19:11:29
回答 2查看 116关注 0票数 1

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

代码语言:javascript
运行
复制
(apply dom/ul nil
    (map person list))

由于dom/ul使用可变数量的参数,所以使用apply与以下方法相比有什么好处:

代码语言:javascript
运行
复制
(dom/ul nil (map person list))

第二种方法似乎更类似于在vanilla中传递children的数组,这是支持的。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-16 22:58:12

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

代码语言:javascript
运行
复制
(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不是一种选择。

票数 2
EN

Stack Overflow用户

发布于 2016-02-17 00:36:51

在Lisp中,您不能传递一个列表或集合来代替单个的变量参数,并期望得到相同的行为。

如果这样做,集合参数将首先被解释为变量参数。要将集合扩展为函数参数,必须使用apply

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35441082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档