2013-04-04 94 views
5

我對Dart還很新,並且=>(胖箭頭)的語法仍令我困惑(我來自C#背景)。Dart lambda/shortland函數混淆

在C#中的脂肪箭頭(=>)

於是說:因此,例如:

Action<string> action1 = (str) => { System.Diagnostic.Debug.WriteLine("Parameter received: " + str.ToString()); } 

action1("Some parameter"); 

是指:凡是派作爲參數傳遞給action1(如果它可以被強制轉換爲string範圍內(在我們的情況下,它只是印在Debug.WriteLine()

但在達特它的不同的東西......(?)

例如Future.then

ClassWithFutures myClass = new ClassWithFutures(); 
myClass.loadedFuture.then( 
    (str) => { print("Class was loaded with info: $str"), 
    onErrro: (exp) => { print("Error occurred in class loading. Error is: $exp"); } 
); 

飛鏢編輯提醒我說,第一和第二print是:Expected string literal for map entry key。我想在C#的方式,str它只是名稱爲參數,將通過Future.then用來調用onValueonError

我做錯了什麼內部的回調填補?

回答

9

你需要選擇任一塊語法或單表達式語法,但不能同時使用。

不能合併=> {}個

你兩個選項是使用你的例子如下:

ClassWithFutures myClass = new ClassWithFutures(); 
myClass.loadedFuture.then( 
    (str) => print("Class was loaded with info: $str"), 
    onErrro: (exp) => print("Error occurred in class loading. Error is: $exp") 
); 

ClassWithFutures myClass = new ClassWithFutures(); 
myClass.loadedFuture.then( 
    (str) { print("Class was loaded with info: $str"); }, 
    onErrro: (exp) { print("Error occurred in class loading. Error is: $exp"); } 
); 

在這兩種情況下,它只是一種表達匿名函數的方式。

通常情況下,如果你只想運行一個表達式,你可以使用=>語法來清理更多的點代碼。例如:

someFunction.then((String str) => print(str)); 

或者您可以使用帶花括號的塊語法來完成更多工作或單個表達式。

someFunction.then((String str) { 
    str = str + "Hello World"; 
    print(str); 
}); 

但是你不能合併它們,因爲那時你正在創建2個函數創建語法,並且它會中斷。

希望這會有所幫助。

9

在飛鏢=> xxx只是一個合成糖,以避免{ return xxx; }。因此,這兩個以下功能是相同的:

var a = (String s) => s; 
var b = (String s) { return s; } ; 

你也可以在方法定義使用=>

String myFunc(String s) => s; 
String myFunc(String s) { 
    return s; 
}