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,->
vs
animate{delay:100},->
。这样你也可以做
动画->
。谢谢,我还没意识到这只是个作业。可能是蟒蛇太多了。看起来很难看或者味道很有趣,很难说