Scala如何理解不同格式的函数调用?

时间:2012-05-06 22:54:16

标签: parsing scala programming-languages compilation

我意识到以下函数调用都是一样的,但我不明白为什么。

val list = List(List(1), List(2, 3), List(4, 5, 6))

list.map(_.length)   // res0 = List(1,2,3) result of 1st call

list map(_.length)   // res1 = List(1,2,3) result of 2nd call

list map (_.length)  // res2 = List(1,2,3) result of 3rd call

我可以理解第一次调用,这只是一个常规函数调用,因为map是类List

的成员函数

但我无法理解第二和第三个电话。例如,在第3次调用中,Scala编译器如何知道“(_.length)”是“map”的参数?编译器如何知道“map”是“list”的成员函数?

2 个答案:

答案 0 :(得分:2)

变体2和3之间的唯一区别是括号前面的空白?这只能是一个分隔符 - list alista当然是不同的,但是一个开放的parens是一个新的令牌,你可以在前面放一个或两个或三个 - 或者没有。我不知道你怎么能在这里看到差异。

在Java中,

之间没有区别
 System.out.println ("foo"); 

//和

 System.out.println("foo"); 

答案 1 :(得分:0)

这是运算符表示法。它起作用的原因与2 + 2的工作原理相同。

该空间用于区分单词 - listmap(_.length)将使编译器查找listmap。但是如果你写list++list,它也会有效,list ++ list也是如此。

因此,如果您使用的是运算符表示法,则需要空格来分隔单词,否则可能存在或不存在。