Coffeescript 默认函数参数排序
通读一遍,我谈到了函数参数的默认值:Coffeescript 默认函数参数排序,coffeescript,Coffeescript,通读一遍,我谈到了函数参数的默认值: fill = (container, liquid = "coffee") -> "Filling the #{container} with #{liquid}..." 这很好,但我试过这个: fill = (container="mug", liquid = "coffee") -> "Filling the #{container} with #{liquid}..." alert fill(liquid="juice") f
fill = (container, liquid = "coffee") ->
"Filling the #{container} with #{liquid}..."
这很好,但我试过这个:
fill = (container="mug", liquid = "coffee") ->
"Filling the #{container} with #{liquid}..."
alert fill(liquid="juice")
fill = (container="mug", liquid = "coffee") ->
"Filling the #{container} with #{liquid}..."
alert fill(null, "juice")
并在“往果汁里灌咖啡…”时收到了意外警报。
。于是我尝试了这个:
fill = (container="mug", liquid = "coffee") ->
"Filling the #{container} with #{liquid}..."
alert fill(liquid="juice")
fill = (container="mug", liquid = "coffee") ->
"Filling the #{container} with #{liquid}..."
alert fill(null, "juice")
它成功了。但这并不漂亮。有更好的方法吗?或者这是惯用的方法吗?目前,没有方法使用命名参数调用。这需要知道调用站点的参数(名称、位置和/或默认值),这在javascript/coffeescript中并不总是可行的 相反,如果您有许多参数,并且希望命名它们并使用默认值,则可以执行以下操作:
fill = (opts = {}) ->
opts.container ?= "mug"
opts.liquid ?= "coffee"
"Filling the #{opts.container} with #{opts.liquid}..."
alert fill
liquid:"juice"
container:"cup"
alert fill
liquid:"juice"
alert fill()
阿米尔和杰里米已经有了这个。正如他们指出的,函数参数列表中的
container=“mug”
实际上只是函数体中container?=“mug”
的简写
让我在调用函数时补充一下
fill(liquid="juice")
与JavaScript中的含义相同:首先,将值“juice”
赋给liquid
变量;然后将液体
输送至加注
。CoffeeScript在这里没有做任何特殊的事情,liquid
在这种情况下的作用域与在函数调用之外的作用域相同
顺便说一下,我建议通过允许跳过参数(例如,
(first,middle?=null,last)->
将值分配给first
和last
,如果只传递了两个参数),使默认参数语法更加强大,而且应该使用?=
语法,而不是=
。您可能希望在此处表示支持该建议:。这绝对是一种规范的方式。CoffeeScript无法直接将命名参数添加到JavaScript中,但其模式匹配对象语法是下一个最好的选择。遗憾的是,目前无法将模式匹配与默认值相结合,因此Jeremy的建议尽可能简洁。我只是想说我发现这个答案有多大帮助,谢谢+1它应该是fill=({container,liquid}={})->…
如果您希望能够在没有任何参数的情况下调用函数,fill()
。此外,您还可以使用位置参数的正常默认值:fill=(quantity=“500 ml”,{container,liquid}={})->……
可以被称为fill()
,fill“1L”
或与命名参数的任何组合,例如fill“1L”,liquid:“JulianD.”答案中应添加作者的评论!我认为,可选函数参数
在jQuery这样的框架中工作得很好,但它们会降低可读性。如果有很多函数在某些代码中使用这种风格,我可能需要查看每个函数定义,以了解参数是什么。例如:animate 100,->
vsanimate{delay:100},->
。这样你也可以做动画->
。谢谢,我还没意识到这只是个作业。可能是蟒蛇太多了。看起来很难看或者味道很有趣,很难说