В CoffeeScript, как мне отформатировать вызов функции, который принимает анонимную функцию и другие аргументы?

Вот надуманный пример, который я придумал:

fn = (f, a, b, c)-> alert("#{f() + a + b + c}")

fn((-> "hi"), 1, 2, 3)

Мне интересно, каков предлагаемый способ форматирования этой последней строки? Этот пример легко понять, но представьте, если бы анонимная функция ((-> "hi")) была многострочной и принимала несколько аргументов. Этот код станет очень уродливым и начнет выглядеть как шепелявость.

fn2 = (f, a, b, c)-> alert("#{f(1, 2) + a + b + c}")

fn2(((a, b) -> 
  c = a + b
  c), 1, 2, 3)

Это может стать довольно неприятным. Есть ли способ отформатировать этот код, чтобы сделать его более читаемым, или лучше всего назвать анонимную функцию?

Я заметил несколько похожих вопросов, спрашивающих, как это сделать. Разница здесь в том, что я спрашиваю, как его отформатировать.


person Daniel Kaplan    schedule 08.08.2013    source источник


Ответы (2)


Я видел, как этот стиль использовался пару раз:

fn2 (a, b) -> 
  a + b
, 1, 2, 3

Например, в setTimeout вызовах:

setTimeout ->
  alert '1 second has passed'
, 1000

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

add = (a, b) -> 
  a + b
fn2 add, 1, 2, 3

Или, если возможно изменить определение функции, сделайте параметр функции последним:

fn2 1, 2, 3, (a, b) ->
  a + b
person epidemian    schedule 08.08.2013

В документации Coffeescript есть пример с последним параметром функции

task 'build:parser', 'rebuild the Jison parser', (options) ->
  require 'jison'
  code = require('./lib/grammar').parser.generate()
  dir  = options.output or 'lib'
  fs.writeFile "#{dir}/parser.js", code

В тестовых файлах Coffeescript есть много примеров с функцией last

test "multiple semicolon-separated statements in parentheticals", ->
  nonce = {}
  eq nonce, (1; 2; nonce)
  eq nonce, (-> return (1; 2; nonce))()

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

person hpaulj    schedule 08.08.2013
comment
Согласен, в node.js в целом вы увидите отстающие функции обратного вызова, так что к этому стоит привыкнуть. - person jcollum; 08.08.2013