Scala中的编译错误 - 类型不匹配

时间:2017-01-20 08:59:02

标签: scala

这个编译没有问题:

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=_ )

1 个答案:

答案 0 :(得分:3)

原因是,每个下划线都引用下一个参数,例如,如果你有一个像这样定义的函数:

def foo(f: (Int, Int) => Int)

您可以使用正好两个下划线的匿名函数:

// Valid:
foo(_ + _)

// Invalid:
foo(_ + 1)
foo(_ + _ + _)

因此,在您的示例中,如果要在foreach函数的闭包中重用参数,则必须以这种方式调用它:

foreach(i => if (i.retweets > max.retweets) max = i)