2017-01-20 6 views
1

This`s компилируется без проблем:ошибка компиляции в 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=_) 
+0

что таким твит? foreach функция, определенная вами? – pedrorijo91

+0

'code'class Tweet (val user: String, val text: String, val retweets: Int) { override def toString: String = " Пользователь: "+ пользователь +" \ n "+ " Текст: "+ текст + "[" + retweets + "]" } – lubom

+1

и что такое функция foreach? потому что я не могу найти, к какому объекту относится эта строка: 'foreach (most (_))' – pedrorijo91

ответ

3

Причиной этого является то, что каждый символ подчеркивания относится к следующему аргументу, так, например, если у вас есть функция, определенная как это:

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

вы можете использовать анонимную функцию, используя ровно два подчеркивания:

// Valid: 
foo(_ + _) 

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

Таким образом, в вашем примере, если вы в нт повторно использовать аргумент в замыкании данного foreach функции, вы должны назвать это таким образом:

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

Работаю! Спасибо. Я понимаю это сейчас. – lubom

+1

Хотя это по-прежнему не так. 'max = <ваша коллекция> .maxBy (_. retweets) .retweets' –