2013-04-28 43 views
4

python即將的功能,我知道我可以很容易地實現這一目標:鏢怎麼做,可以接受任何數量的ARGS

def someFunc(*args): 
    for i in args: 
     print i 

這樣我可以給100個ARGS輕鬆。

如何在Dart上做類似的事情?

Thx。

+2

([與在鏢參數或參數可變數目創建函數]的可能重複http://stackoverflow.com/questions/13731631 /創建功能與 - 可變數的論點 - 或 - 參數 - 在-DART) – Fox32 2013-04-28 13:57:01

回答

9

在DART中,沒有真正的可變參數的支持。有,但它一直是removed。正如Fox32所說,你可以用noSuchMethod來做到這一點。但是,如果沒有真正需要調用方法method(param1, param2, param3),則可以跳過此步驟並將MapList定義爲參數。鏢支持這兩種類型的文字,所以,語法也短而明確:

void method1(List params) { 
    params.forEach((value) => print(value)); 
} 

void method2(Map params) { 
    params.forEach((key, value) => print("$key -- $value")); 
} 

void main() { 
    method1(["hello", "world", 123]); 
    method2({"name":"John","someNumber":4711}); 
} 
2

您可以在類上使用noSuchMethod方法(可能與call()方法結合使用,但我沒有嘗試過)。但是,當你使用這個時(至少對我來說),似乎你放棄了飛鏢編輯器的一些檢查功能。

該方法有一個Invocation實例作爲參數,其中包含方法名稱和所有未命名的參數作爲列表,並將所有命名參數作爲哈希映射。

有關noSuchMethodcall()的更多詳細信息,請參閱here。但鏈接包含不適用於里程碑4的過時信息,請參閱here以瞭解更改。

事情是這樣的:

typedef dynamic FunctionWithArguments(List<dynamic> positionalArguments, Map<Symbol, dynamic> namedArguments); 

class MyFunction 
{ 
    final FunctionWithArguments function; 

    MyFunction(this.function); 

    dynamic noSuchMethod(Invocation invocation) { 
    if(invocation.isMethod && invocation.memberName == const Symbol('call')) { 
     return function(invocation.positionalArguments, invocation.namedArguments); 
    } 

    return; 
    } 
} 

用法:

class AClass { 
    final aMethod = new MyFunction((p, n) { 
    for(var a in p) { 
     print(a); 
    } 
    }); 
} 


var b = new AClass(); 

b.aMethod(12, 324, 324); 
相關問題