2010-06-02 4 views
4

Скажем, у меня есть некоторые Scala код вроде этого:Почему я не могу вызвать методы для выражения for-yield?

// 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?

ответ

18

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

His для понимания является лишь синтаксическим сахаром для точно такого же метода отображения, который вы предоставили. На мой взгляд, вы хотите использовать только вопрос вкуса. –

5

Просто круглые скобки для цикла, и она работает:

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(", ") 
Смежные вопросы