2012-12-05 106 views
22

我正在尋找一種方法來在Dart中創建具有可變數量參數或參數的函數。我知道我可以創建一個數組參數,但我寧願不這樣做,因爲我正在研究一個句法簡潔性很重要的庫。在飛鏢中創建具有可變數量參數或參數的函數

例如,在普通的JavaScript,我們可以做這樣的事情(從here借用):

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

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

然而,飛鏢,該代碼將無法運行。有沒有辦法在飛鏢中做同樣的事情?如果不是,這是路線圖上的東西嗎?

回答

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

哇,這是一個非常整潔的解決方案。我喜歡dart處理參數的方式,但是這對於那些喜歡它的開發者來說可能會有所幫助。 –

+0

非常好!我沒有多少關注該語言的InvocationMirror部分,所以感謝一個很好的例子。我微調了你的答案,以創建一個適用於當前版本的Dart的版本。 – plowman

2

對於你寫的例子,我認爲你最好使用一個列表。對於那個很抱歉!

我正在看dartbug.com,但我沒有看到針對此的功能請求。絕對歡迎您創建一個!

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()中的成員名稱,如果更改方法名稱,則更有可能忘記更改「超級英雄」字符串。
  • 反射使代碼路徑更難跟蹤。

但是如果你對所有這些問題都很好,那麼這可以完成工作。

+1

我相信還有另外一個問題需要提及:只有當你通過多個參數時它纔會起作用。如果只傳遞一個字符串,則會調用原始超級英雄方法,並且noSuchMethod機制將被忽略。 – Ladicek

3

如果你真的進入句法簡潔,只要聲明一個函數/方法說10個可選的位置參數並完成。不太可能有人會用超過10個參數來調用它。

如果這聽起來像一個黑客,這是因爲它是一個黑客。但我見過Dart團隊也是這樣做的:-)

+0

我已經添加@kludge元數據 –

+0

然後該方法必須對每個十個參數進行特殊檢查(如果arg1!= null ...,如果arg2!= null ...)?毛! –

+0

我已經說過這是一個黑客行爲,它有一個API設計者可能願意支付的價格。 – Ladicek

相關問題