这个编译没有问题:
class Tweet(val user: String, val text: String, val retweets: Int) {
override def toString: String = "User: " + user + "\n" + "Text: " + text + " [" + retweets + "]"
}
var max: Tweet = elem
def most(cur: Tweet) {
if (cur.retweets > max.retweets) max=cur
}
foreach(most( _ ))
但这不能编译:
var max: Tweet = elem
foreach( if ( _.retweets > max.retweets) max=_ )
为什么?
我收到了这个错误:
Error:(157, 19) missing parameter type for expanded function ((x$1) => x$1.retweets.$greater(max.retweets))
foreach( if ( _.retweets > max.retweets) max=_ )
Error:(157, 14) type mismatch;
found : Unit
required: objsets.Tweet => Unit
foreach( if ( _.retweets > max.retweets) max=_ )
答案 0 :(得分:3)
原因是,每个下划线都引用下一个参数,例如,如果你有一个像这样定义的函数:
def foo(f: (Int, Int) => Int)
您可以使用正好两个下划线的匿名函数:
// Valid:
foo(_ + _)
// Invalid:
foo(_ + 1)
foo(_ + _ + _)
因此,在您的示例中,如果要在foreach
函数的闭包中重用参数,则必须以这种方式调用它:
foreach(i => if (i.retweets > max.retweets) max = i)