Дарт лямбда/коротковолновой путаницы

Я все еще довольно новичок в Dart, и синтаксис => (жирная стрелка) все еще смущает меня (я из С# background).

Так в С# жирная стрелка (=>) говорит: идет к так например:

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

action1("Some parameter");

означает: что бы ни было action1 качестве параметра в action1 (если оно может быть преобразовано в string), оно попадает во внутреннюю область (в нашем случае это просто печатается в Debug.WriteLine()

но в дартсе это что то другое.... (?)

например в Future.then

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

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

Что я делаю не так?

Ответ 1

Вам нужно выбрать синтаксис блока или синтаксис одиночного выражения, но не оба.

Вы не можете комбинировать = > с {}

Ваши два варианта следующие, используя ваш пример:

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-х функций, и он ломается.

Надеюсь, что это поможет.

Ответ 2

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

Ответ 3

Этот синтаксис хорошо работает в таких языках, как javascript, а также С#, где он поддерживает (param1, param2, …, paramN) => { statements } причем оператор разделяется (param1, param2, …, paramN) => { statements }. В дротике жирная стрелка поддерживает только выражение, которое является сокращением для { return expr; } { return expr; }
Это объясняет вашу ошибку. Ваш код с фигурной скобкой (exp) => { print("Error occurred in class loading. Error is: $exp"); } (exp) => { print("Error occurred in class loading. Error is: $exp"); } означает, что вы возвращаете карту, поэтому она ожидает увидеть что-то вроде (param) => {"key": "value"} где key - строковый литерал.