0

拿:

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))
                   ^

不太有帮助。这里发生了什么?我了解下划线不能用于表示多个参数,但它在这里仅用作一个参数的替代。我不明白为什么编译器不会接受这个,我也不明白它对方法 ::: 的引用,它没有被调用。

4

2 回答 2

5

闭包中的下划线按声明顺序引用闭包的参数,不能用于引用相同的参数。

关于编译器错误,它指的是方法::,而不是:::- 第三个冒号是错误消息的一部分,而不是方法名称!由于赋值运算符 ,它被调用::=

于 2013-08-05T16:38:48.300 回答
1

每个参数最多可以使用参数占位符_一次。

所以它第一次出现时映射到第一个参数,第二次出现时映射到第二个参数,以此类推。如果 '_' 比参数多,那将是一个编译问题。

于 2013-08-05T16:33:33.487 回答