采取:
var data = List[(DateTime, Double)]()
val pairs = io.Source.fromInputStream(getClass.getResourceAsStream("/data.csv")).getLines().map(_.split(","))
pairs.foreach(pair => data ::= (dateFormatter.parseDateTime(pair(0)), pair(1).toDouble))
没有问题。如果我们决定使用参数占位符而不是声明对,如下所示:
pairs.foreach(data ::= (dateFormatter.parseDateTime(_(0)), _(1).toDouble))
编译器不会接受它。此外,错误:
too many arguments for method ::: (x: B)List[B]
pairs.foreach(data ::= (dateFormatter.parseDateTime(_(0)), _(1).toDouble))
^
没有太大帮助。这里发生了什么?我知道下划线不能用于表示多个参数,但它仅在此用作一个参数的替代。我不明白为什么编译器不接受这个,也不理解它对方法:::的引用,它没有被调用。
答案 0 :(得分:5)
闭包中的下划线以声明顺序引用闭包的参数,不能用于引用相同的参数。
关于编译器错误,它引用方法::
,而不是:::
- 第三个冒号是错误消息的一部分,而不是方法名称的一部分!由于assignment operator ::=
而正在调用它。
答案 1 :(得分:1)
参数占位符_
最多可以为每个参数使用一次。
所以它第一次出现时会映射到第一个参数,第二次出现时会映射到第二个参数,依此类推。如果有更多'_'而不是参数,那将是一个编译问题。