Почему я не могу вызвать методы для выражения for-yield?
Скажем, у меня есть код Scala, как это:
// Outputs 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
println( squares)
def squares = {
val s = for ( count <- 1 to 10 )
yield { count * count }
s.mkString(", ");
}
Почему я должен использовать временные val s? Я пробовал это:
def squares = for ( count <- 1 to 10 )
yield { count * count }.mkString(", ")
Что не удается скомпилировать с этим сообщением об ошибке:
error: value mkString is not a member of Int
def squares = for ( count <- 1 to 10 ) yield { count * count }.mkString(", ")
Не следует ли вызывать mkString в коллекции, возвращаемой циклом for?
Ответы
Ответ 1
Отсутствует скобка. Вы хотите вызвать метод mkString в результате выражения for -expression. Без дополнительной скобки компилятор считает, что вы хотите называть mkString -метод на {count * cout}, который является Int.
scala> def squares = (for ( count <- 1 to 10 ) yield { count * count }).mkString(", ")
squares: String
scala> squares
res2: String = 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
В любом случае, я предлагаю вам использовать метод map:
scala> 1 to 10 map { x => x*x } mkString(", ")
res0: String = 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
Ответ 2
Просто поместите круглые скобки вокруг цикла for, и он работает:
scala> (for (count <- 1 to 10) yield { count * count }).mkString(", ")
res0: String = 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
Ответ 3
Когда вы вызываете mkString, как у вас во втором примере, он не вызывается в коллекции, а на каждом возвращаемом отдельном целое, поэтому появляется сообщение об ошибке: mkString is not a member of Int.
Если вы хотите вызвать методы в самом выражении for..yield, вам необходимо заключить в скобки:
def squares = (for (count <- 1 to 10) yield { count * count }).mkString(", ")