我仍然很新的DART和=>(脂肪箭头)的语法仍然混淆了我(我来自C#背景)。
因此,在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
用来调用onValue
或onError
我做错了吗?
你需要选择任一块语法或单表达式语法,但不能同时使用。
不能合并=>与{}
你的两个选项是使用你的例子如下:
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个功能创作语法和它打破了将它们结合起来。
希望这可以帮助。
在飞镖=> xxx
只是一个syntaxic糖避免{ return 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;
}
这句法效果很好像JavaScript语言也是C#它支持(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是一个字符串。