2012-12-05 8 views
22

Dartで可変数の引数またはパラメータを使用して関数を作成する方法を探しています。私は代わりに配列のパラメータを作成することができます知っているが、私は構文上の簡潔さが重要なライブラリに取り組んでいるので、それをしないことを好むだろう。Dartで可変数の引数またはパラメータを使用して関数を作成する

function superHeroes() { 
    for (var i = 0; i < arguments.length; i++) { 
    console.log("There's no stopping " + arguments[i]); 
    } 
} 

superHeroes('UberMan', 'Exceptional Woman', 'The Hunk'); 

しかし、ダーツでは、そのコードが実行されません。

は例えば、プレーンJavaScriptで、我々は(hereから借りた)このような何かを行うことができます。ダーツで同じことをする方法はありますか?もしそうでなければ、これはロードマップ上の何かですか?

答えて

16

今はできません。

が戻ってくるを可変引数場合、私は本当に知らない - 彼らはいくつかの時間前にはなくhave been removedがありました。

可変部Emulating functionsとエミュレートすることは可能です。下記のコードスニペットを参照してください。

typedef dynamic OnCall(List); 

class VarargsFunction extends Function { 
    OnCall _onCall; 

    VarargsFunction(this._onCall); 

    call() => _onCall([]); 

    noSuchMethod(Invocation invocation) { 
    final arguments = invocation.positionalArguments; 
    return _onCall(arguments); 
    } 
} 

main() { 
    final superHeroes = new VarargsFunction((arguments) { 
    for (final superHero in arguments) { 
     print("There's no stopping ${superHero}"); 
    } 
    }); 
    superHeroes('UberMan', 'Exceptional Woman', 'The Hunk'); 
} 
+0

うわー本当にきれいな解決策です。私はダーツが引数を扱う方法が好きですが、これは他の方法でそれを好きな開発者に役立ちます。 –

+0

非常に良い!私は言語のInvocationMirrorの部分をあまり見なかったので、すばらしい例のおかげです。あなたの答えを少し微調整して、現在のバージョンのDartで動作するバージョンを作成しました。 – plowman

2

あなたが書いた例では、リストを使うのが一番良いと思います。それについて申し訳ありません!

私はdartbug.comを見ていますが、この機能のリクエストはありません。あなたは間違いなく1つ作成することができます!

5

私はアレクサンドルArdhuinの答えに少し周りを演奏し、私たちはダートの現在のバージョンでは、この作業をするために物事のカップルを微調整できることがわかった。

class VarArgsClass { 
    noSuchMethod(InvocationMirror invocation) { 
    if (invocation.memberName == 'superheroes') { 
     this.superheroes(invocation.positionalArguments); 
    } 
    } 

    void superheroes(List<String> heroNames) { 
    for (final superHero in heroNames) { 
     print("There's no stopping ${superHero}!"); 
    } 
    } 
} 

main() { 
    new VarArgsClass().superheroes('UberMan', 'Exceptional Woman', 'The Hunk'); 
} 

これは、問題の多くを持っているなど、:

  • superheroes()と署名がパラメータと一致しないため、いつでも警告が生成されます。
  • スーパーヒーローに渡される引数のリストが本当にList<String>であることを確認するためには、さらに手作業によるチェックが必要です。
  • メンバー名をnoSuchMethod()にチェックする必要があるため、メソッド名を変更すると「スーパーヒーロー」の文字列を変更する可能性が高くなります。
  • Reflectionは、コードパスをトレースするのをより困難にします。

しかし、これらの問題がすべて問題ない場合は、この作業が完了します。

+1

私はあなたに言及されていると信じている1つの他の問題があります:あなたは複数の引数を渡す場合にのみ動作します。 1つの文字列だけを渡すと、元のスーパーヒーローメソッドが呼び出され、noSuchMethod機構は無視されます。 – Ladicek

3

構文が簡潔になっている場合は、10個のオプションの位置パラメータを指定して関数/メソッドを宣言して終了するだけです。誰かがそれを10以上の引数で呼び出すことはまずありません。

ハックのように聞こえる場合は、ハックであるためです。しかし、私はダーツチームが同じことをやっているのを見ました:-)

+0

私は既に@kludgeのメタデータを追加しました –

+0

そして、メソッドは10個の引数のそれぞれについて特別なチェックをしなければなりません(もしarg1!= null ...ならarg2!= null ...)?キモい! –

+0

私は既にそれがハックだと言っていましたが、APIデザイナーが支払う可能性のある価格があります。 – Ladicek

関連する問題