Dart lambda/shortland功能混乱

Jas*_*per 37 dart

我仍然是Dart的新手,=>(胖箭头)的语法仍然让我感到困惑(我来自C#背景).

因此,在C#脂肪箭头(=>)表示:进入因此,例如:

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

action1("Some parameter");
Run Code Online (Sandbox Code Playgroud)

意味着:无论发送为参数action1(如果它可以被转换为string)都转到 内部范围(在我们的例子中它只是打印在内部)Debug.WriteLine()

但在Dart中它有所不同......(?)

例如在 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"); }
);
Run Code Online (Sandbox Code Playgroud)

飞镖编辑警告我,第一和第二print是:Expected string literal for map entry key.我认为在C#方式中str它只是为参数命名,该参数将由Future.then用于调用onValue或的内部回调填充onError

我做错了什么?

Dae*_*lus 59

您需要选择块语法或单个表达式语法,但不能同时选择两者.

你无法将=>与{}结合起来

使用您的示例,您的两个选项如下:

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")
);
Run Code Online (Sandbox Code Playgroud)

要么

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"); }
);
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,它只是表达匿名函数的一种方式.

通常,如果您只想运行单个表达式,则使用=>语法表示清除程序,使用更多指向代码的表达式.例:

someFunction.then( (String str) => print(str) );
Run Code Online (Sandbox Code Playgroud)

或者您可以使用带花括号的块语法来执行更多工作或单个表达式.

someFunction.then( (String str) {
  str = str + "Hello World";
  print(str);
});
Run Code Online (Sandbox Code Playgroud)

但你无法将它们组合起来,因为那时你正在制作2个函数创建语法并且它会中断.

希望这可以帮助.

  • 当有多个表达式时,可以将 =&gt; 与 {} 一起使用。(值) =&gt; { 条件 = false, print('周期性计时器!') } (2认同)

Ale*_*uin 34

在Dart => xxx只是一个要避免的语法糖{ return xxx; }.因此,以下两个函数是等效的:

var a = (String s) => s;
var b = (String s) { return s; } ;
Run Code Online (Sandbox Code Playgroud)

您还可以使用=>方法定义:

String myFunc(String s) => s;
String myFunc(String s) {
  return s;
}
Run Code Online (Sandbox Code Playgroud)