镖的λ/肖特兰功能混乱(Dart lambda/shortland function confusi

2019-08-19 09:50发布

我仍然很新的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用来调用onValueonError

我做错了吗?

Answer 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个功能创作语法和它打破了将它们结合起来。

希望这可以帮助。



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


Answer 3:

这句法效果很好像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是一个字符串。



文章来源: Dart lambda/shortland function confusion
标签: dart