Дарт лямбда/коротковолновой путаницы
Я все еще довольно новичок в 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 - строковый литерал.