Dart lambda / shortland功能混乱

时间:2013-04-04 06:35:19

标签: dart

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

所以在C#胖箭头(=>)中说:转到所以例如:

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

action1("Some parameter");

表示:无论是作为参数发送到action1(如果它可以转换为string),都会转到内部范围(在我们的例子中,它只是打印在{{1} }}

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

例如在Debug.WriteLine()

Future.then

Dart编辑警告我,第一个和第二个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。我认为在C#方式Expected string literal for map entry key它只是为参数命名,该参数将由str用于调用Future.thenonValue

的内部回调填充

我做错了什么?

3 个答案:

答案 0 :(得分:45)

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

你无法合并=&gt;与{}

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

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"); }
);

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

通常,如果您只想运行单个表达式,请使用=&gt;更清洁的语法和更多的点代码。例如:

someFunction.then( (String str) => print(str) );

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

someFunction.then( (String str) {
  str = str + "Hello World";
  print(str);
});

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

希望这有帮助。

答案 1 :(得分:27)

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

答案 2 :(得分:0)

该语法在javascript和c#等语言中都很好用,它支持public void syllabusAttach(){ String selectSQL = "SELECT Image_Reg FROM "+getRegulation()+" WHERE SubjectCode="+getSubCode()+""; ResultSet rs = null; FileOutputStream fos = null; Connection conn = null; Statement stmt = null; try { conn = connect(); stmt = conn.createStatement(); rs = stmt.executeQuery(selectSQL); // write binary stream into file InputStream is =rs.getBinaryStream("Image_Reg"); File file = new File("syllabus_"+getRegulation()+".pdf"); OutputStream os = new FileOutputStream(file); System.out.println("Writing BLOB to file " + file.getAbsolutePath()); byte[] content = new byte[1024]; int size = 0; while((size = is.read(content)) !=-1){ os.write(content,0,size); } } catch (SQLException | IOException e) { System.out.println(e.getMessage()); } finally { try { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } if (fos != null) { fos.close(); } } catch (SQLException | IOException e) { System.out.println(e.getMessage()); } } } write binary stream into file File file = new File("syllabus_"+getRegulation()+".pdf"); fos = new FileOutputStream(file); System.out.println("Writing BLOB to file " + file.getAbsolutePath()); while (rs.next()) { InputStream input = rs.getBinaryStream("Image_Reg"); byte[] buffer = new byte[1024]; while (input.read(buffer) > 0) { fos.write(buffer); } } 且语句之间用半冒号分隔。在dart中,粗箭头仅支持表示(param1, param2, …, paramN) => { statements }的缩写。
那解释了你的错误。带有花括号{ return expr; }的代码表示您正在返回地图,因此它希望看到类似于(exp) => { print("Error occurred in class loading. Error is: $exp"); }的内容,其中key是字符串文字。