Почему я не могу вызвать методы для выражения for-yield? - PullRequest
4 голосов
/ 02 июня 2010

Скажем, у меня есть такой код 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 ]

18 голосов
/ 02 июня 2010

Отсутствует скобка. Вы хотите вызвать метод mkString для результата выражения for. Без лишних скобок компилятор думает, что вы хотите вызвать 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
5 голосов
/ 02 июня 2010

Просто поставьте круглые скобки вокруг цикла for, и это работает:

scala> (for (count <- 1 to 10) yield { count * count }).mkString(", ") 

res0: String = 1, 4, 9, 16, 25, 36, 49, 64, 81, 100

3 голосов
/ 02 июня 2010

Когда вы вызываете mkString, как во втором примере, он вызывается не для коллекции, а для каждого возвращаемого целого числа, поэтому появляется сообщение об ошибке: mkString is not a member of Int.
Если вы хотите вызывать методы для самого выражения for..yield, вам нужно заключить его в скобки:

def squares = (for (count <- 1 to 10) yield { count * count }).mkString(", ")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...