2010-06-02 53 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

有一个缺失的括号。您想针对for表达式的结果调用mkString方法。如果没有额外的圆括号,编译器会认为你想调用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

他的理解是,你所提供的完全一样的地图方法只是语法糖。在我看来,你想使用的仅仅是品味的问题。 – 2010-06-02 14:42:25

5

只要把括号周围的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,就像你在你身边ond的例子中,它没有在集合上被调用,而是在返回的每个单独的整数上,因此错误消息:mkString is not a member of Int
如果你想呼吁for..yield表达自己的方法,你需要加上括号它:

def squares = (for (count <- 1 to 10) yield { count * count }).mkString(", ")