Почему я не могу вызвать методы для выражения 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(", ");
}
Почему я должен использовать временные значения? Я попробовал это:
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
цикл?
3 ответа
Отсутствует скобка. Вы хотите позвонить 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
Просто поставьте круглые скобки вокруг цикла for, и это работает:
scala> (for (count <- 1 to 10) yield { count * count }).mkString(", ")
res0: String = 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
Когда вы звоните mkString
как и во втором примере, он вызывается не для коллекции, а для каждого возвращаемого целого числа, поэтому появляется сообщение об ошибке: mkString is not a member of Int
,
Если вы хотите вызвать методы на for..yield
само выражение, вам нужно заключить его в скобки:
def squares = (for (count <- 1 to 10) yield { count * count }).mkString(", ")