通过this阅读,我找到了函数参数的默认值:
fill = (container, liquid = "coffee") ->
"Filling the #{container} with #{liquid}..."
那很整洁,但后来我尝试了这个:
fill = (container="mug", liquid = "coffee") ->
"Filling the #{container} with #{liquid}..."
alert fill(liquid="juice")
并通过"Filling the juice with coffee..."
获得了意外提醒。所以我试过这个:
fill = (container="mug", liquid = "coffee") ->
"Filling the #{container} with #{liquid}..."
alert fill(null, "juice")
它有效。虽然它不漂亮。是否有更好的方法,或者这是否是这种惯用方式?
答案 0 :(得分:83)
fill = ({container, liquid} = {}) ->
container ?= "mug"
liquid ?= "coffee"
"Filling the #{container} with #{liquid}..."
alert fill(liquid: "juice", container: "glass")
alert fill()
fill = (quantity="500 mL", {container, liquid} = {}) ->
container ?= "mug"
liquid ?= "coffee"
"Filling the #{container} with #{quantity} of #{liquid}..."
alert fill("1L", liquid: "juice", container: "glass")
alert fill()
alert fill "1L"
alert fill "1L", liquid: "water"
答案 1 :(得分:8)
Amir和Jeremy已经有了这个。正如他们所指出的,函数参数列表中的container="mug"
实际上只是函数体中container ?= "mug"
的简写。
让我在调用函数时添加它,
fill(liquid="juice")
与JavaScript中的含义相同:首先,将值"juice"
分配给liquid
变量;然后将liquid
传递给fill
。 CoffeeScript在这里没有做任何特别的事情,liquid
在这种情况下的范围与在函数调用之外的范围相同。
顺便说一句,我建议通过允许跳过参数来使默认参数语法更强大(例如(first, middle ?= null, last) ->
会将值赋给first
和last
只传递了两个参数),并且应该使用?=
语法而不是=
。您可能希望在此处表达对该提案的支持:issue 1091。
答案 2 :(得分:4)
目前,无法使用命名参数调用。它需要知道调用站点的参数(名称,位置和/或默认值),这在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()