【问题标题】:Dart lambda/shortland function confusionDart lambda/shortland 函数混淆
【发布时间】:2013-03-26 02:35:23
【问题描述】:

我对 Dart 还是很陌生,=>(粗箭头)的语法仍然让我感到困惑(我来自 C# 背景)。

所以在 C# 中,胖箭头 ( => ) 表示:goes to 例如:

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

action1("Some parameter");

表示:任何作为参数发送到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"); }
);

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

我做错了什么?

【问题讨论】:

  • 您的示例中缺少大括号:(str) =&gt; { print("Class was loaded with info: $str") },

标签: dart


【解决方案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 个函数创建语法并且它会中断。

希望这会有所帮助。

【讨论】:

  • 当您有多个表达式时,您可以将 => 与 {} 一起使用。 (值) => { 条件 = false, print('周期性计时器!') }
【解决方案2】:

在 Dart 中,=&gt; xxx 只是一个语法糖来避免{ return xxx; }。因此以下两个函数是等价的:

var a = (String s) => s;
var b = (String s) { return s; } ;

您也可以在方法定义上使用=&gt;

String myFunc(String s) => s;
String myFunc(String s) {
  return s;
}

【讨论】:

    【解决方案3】:

    这种语法在 javascript 和 c# 等语言中运行良好,它支持(param1, param2, …, paramN) =&gt; { statements },语句用分号分隔。在 dart 中,粗箭头仅支持 { return expr; } 的简写形式。
    这解释了你的错误。带有大括号 (exp) =&gt; { print("Error occurred in class loading. Error is: $exp"); } 的代码表示您正在返回一个映射,因此它希望看到类似 (param) =&gt; {"key": "value"} 的内容,其中 key 是字符串文字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 2013-04-12
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多