2013-04-04 18 views
5

Nadal jestem całkiem nowy dla Dart, a składnia => (gruba strzała) wciąż mnie myli (pochodzę z tła C#).Dezorientacja funkcji darta lambda/shortland

Więc w C# tłuszczu strzałką (=>) mówi: idzie tak na przykład:

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

action1("Some parameter"); 

oznacza: cokolwiek wysłać jako parametr do action1 (jeśli może to być lanego do string) idzie do zakres wewnętrzna (w naszym przypadku jest tylko drukowane w Debug.WriteLine()

ale w Dart to coś innego .... (?)

na przykład w 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"); } 
); 

redaktor Dart mnie ostrzec, że pierwszy i drugi print jest: Expected string literal for map entry key. Myślę, że w C# sposób, że str to tylko nazwa dla parametru, który będzie wypełniony przez wewnętrzne zwrotnego że Future.then używa zadzwonić onValue lub onError

Co robię źle?

Odpowiedz

9

Trzeba wybrać albo blok składni lub składni jeden wyraz, ale nie oba.

Nie można łączyć => z {}

Twoje dwie opcje są następujące używając przykładu:

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") 
); 

lub

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"); } 
); 

W obu przypadkach jest to po prostu sposób na wyrażenie anonimowej funkcji.

Normalnie, jeśli chcesz uruchomić pojedyncze wyrażenie, używaj składni => do czyszczenia, a więcej do kodu punktu. Przykład:

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

lub można użyć składni bloków z nawiasami klamrowymi, aby wykonać więcej pracy lub pojedynczego wyrażenia.

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

ale nie można ich łączyć, ponieważ tworzysz 2 składy tworzenia funkcji i się zepsuje.

Mam nadzieję, że to pomoże.

9

W Dart => xxx to tylko cukier syntaktyczny, aby uniknąć { return xxx; }. Zatem obie poniższe funkcje są równoważne:

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

Można również użyć => na definicjach metoda:

String myFunc(String s) => s; 
String myFunc(String s) { 
    return s; 
} 
Powiązane problemy