2013-04-04 3 views
5

Я до сих пор довольно новичок в Dart, и синтаксис => (жирная стрелка) все еще меня смущает (я исхожу из фона C#).Dart lambda/shortland function confusion

Так в 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"); } 
); 

Dart редактор предупредить меня о том, что первый и второй print является: Expected string literal for map entry key. Я думаю, что в C# так, что str это просто имя для параметра, который будет наполняться внутренним обратным вызовом, который Future.then используется для вызова onValue или onError

Что я делаю неправильно?

ответ

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

In Dart => 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; 
}