斯卡拉:_的极限

时间:2013-08-05 16:26:49

标签: scala

采取:

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

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

2 个答案:

答案 0 :(得分:5)

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

关于编译器错误,它引用方法::,而不是::: - 第三个冒号是错误消息的一部分,而不是方法名称的一部分!由于assignment operator ::=而正在调用它。

答案 1 :(得分:1)

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

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