1

私は次のコードを持っています

class A

  constructor: (@message) ->

  parse: (paramNames...) ->
    params = @message.split(/\s/)
    for value, i in params
      @[paramNames[i]] = value

a = new A('foo bar dim sum')
a.parse 'first', 'second', 'third', 'fourth'
console.log a

出力

{
  message: 'foo bar dim sum',
  first: 'foo',
  second: 'bar',
  third: 'dim',
  fourth: 'sum'
}

すべてがうまくいきます、私はちょうどparse方法が少しきれいにされることができたように感じます。私は何か間違ったことをしているようです:S

parse()ユーザーから呼び出されることはありません。私が書いているライブラリの内部でのみ使用されます。paramNames.lengthparams.length常に等しいと仮定するのが安全です。

4

2 に答える 2

1

Underscore のobject機能は、探していることだけを行います。それを次と組み合わせる_.extend

class A

  constructor: (@message) ->

  parse: (paramNames...) ->
    params = @message.split(/\s/)
    _.extend @, (_.object paramNames, params)

アンダースコアを使用していない場合、現在のソリューションはすでに非常に明確でシンプルだと思います。

于 2012-12-17T03:14:21.047 に答える
0

次のような Strings replace 関数を使用できます。

parse : (paramNames...) ->
    keyCount = 0
    @message.replace( /(\b\w+\b)/g , (match)->
        @[paramNames[keyCount++]] = match
    )

split メソッドを実行してから、コードで使用している for 反復を実行するよりも効率的です。私が使用した正規表現がニーズを満たしていることを確認してください。必要なものに変更できます。

于 2012-12-17T03:28:23.993 に答える