我意识到以下函数调用都是一样的,但我不明白为什么。
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”的成员函数?
答案 0 :(得分:2)
变体2和3之间的唯一区别是括号前面的空白?这只能是一个分隔符 - list a
和lista
当然是不同的,但是一个开放的parens是一个新的令牌,你可以在前面放一个或两个或三个 - 或者没有。我不知道你怎么能在这里看到差异。
在Java中,
之间没有区别 System.out.println ("foo");
//和
System.out.println("foo");
太
答案 1 :(得分:0)
这是运算符表示法。它起作用的原因与2 + 2
的工作原理相同。
该空间用于区分单词 - listmap(_.length)
将使编译器查找listmap
。但是如果你写list++list
,它也会有效,list ++ list
也是如此。
因此,如果您使用的是运算符表示法,则需要空格来分隔单词,否则可能存在或不存在。