Порядок параметров функции по умолчанию - PullRequest
50 голосов
/ 09 марта 2011

Читая это , я пришел к биту значений по умолчанию для аргументов функции:

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 ]

83 голосов
/ 09 марта 2011
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"
8 голосов
/ 09 марта 2011

Амир и Джереми уже имеют это. Как они указывают, container="mug" в списке аргументов функции - это просто сокращение для container ?= "mug" в теле функции.

Позвольте мне просто добавить, что при вызове функций,

fill(liquid="juice")

означает то же самое, что и в JavaScript: сначала присвойте значение "juice" переменной liquid; затем передайте liquid по fill. CoffeeScript здесь не делает ничего особенного, и liquid имеет ту же область действия в этой ситуации, что и вне вызова функции.

Кстати, я предложил сделать синтаксис аргументов по умолчанию более мощным, допустив пропуск аргументов (например, (first, middle ?= null, last) -> назначит значения для first и last, если будут переданы только два аргумента) и что следует использовать синтаксис ?=, а не =. Вы можете выразить поддержку этому предложению здесь: выпуск 1091 .

4 голосов
/ 09 марта 2011

В настоящее время нет способа вызова с именованными аргументами. Для этого потребуется знать аргументы (имена, позиции и / или значения по умолчанию) на вызывающем сайте, что не всегда возможно в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...