默认的function参数sorting
通过阅读,我来到了函数参数的默认值:
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")
它的工作。 虽然不是很漂亮 有没有更好的方法,或者这是做到这一点的惯用方法?
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"
埃米尔和杰里米已经有了这个。 正如他们指出的,函数的参数列表中的container="mug"
实际上只是函数体中的container ?= "mug"
缩写。
让我补充一点,在调用函数时,
fill(liquid="juice")
意味着与JavaScript相同的东西:首先,将值"juice"
分配给liquid
variables; 然后通过liquid
来fill
。 CoffeeScript在这里没有做任何特殊的事情,而且在这种情况下, liquid
与函数调用之外的范围相同。
顺便说一句,我build议通过允许跳过参数来使默认参数语法更强大(例如(first, middle ?= null, last) ->
如果只有两个参数是通过),而应该使用?=
语法而不是=
。 您可能要在此表示对该提案的支持: 问题1091 。
目前,无法使用命名参数进行调用。 这将需要知道调用网站的参数(名称,位置和/或默认值),这在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()