默认功能参数排序

时间:2011-03-08 21:13:53

标签: coffeescript

通过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")

它有效。虽然它不漂亮。是否有更好的方法,或者这是否是这种惯用方式?

3 个答案:

答案 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) ->会将值赋给firstlast只传递了两个参数),并且应该使用?=语法而不是=。您可能希望在此处表达对该提案的支持: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()