2012-11-01 122 views
3

我想學習斯卡拉,在這裏我使用基本的循環,但我在編譯時遇到錯誤。循環的基本斯卡拉問題

object App {  
    def main(args: Array[String]) { 

    for (i <- 1 to 10; i % 2 == 0) 
     Console.println("Counting " + i) 

    } 
} 

錯誤而編譯:

fortest.scala:5: error: '<-' expected but ')' found. 

    for (i <- 1 to 10; i % 2 == 0) 
           ^
fortest.scala:7: error: illegal start of simple expression 

    } 
^

two errors found 

我使用Scala的版本2.9.1

任何想法是什麼問題.............. ?

回答

7

Scala不是Java,因此您不能使用常規的Java語法。相反,你需要做的:

for{ 
    i <- 1 to 10 
    if(i % 2 == 0) 
}{println("Counting " + i)} 

;定界符的()括號內:

for(i <- 1 to 10;if(i % 2 == 0)){ 
    println("Counting " + i) 
} 

另外請注意,Scala的for表達式,有一些非常漂亮的能力。 你可以使用一個for表達式與多個「循環迭代器」和條件。

,而不需要編寫例如,:

for(i <- 1 to n; if(someCondition(i)){ 
    for(j <- 1 to m; if(otherCondition(j)){ 
     //Do something 
    } 
} 

你可以簡單的寫:

for{ 
    i <- 1 to n 
    if(someCondition(i)) 
    j <- 1 to m 
    if(otherCondition(j)) 
}{ 
    //Do something 
} 

邊注:
當你擴展App(有這個名字的Predef一個特質),你不需要定義一個主要的方法。你可以簡單地編寫代碼的object大括號:

object MyClazz extends App { 
    for(i <- 1 to 10;if(i % 2 == 0)){ 
     println("Counting " + i) 
    } 
} 
+0

謝謝,什麼後面階的基本概念,這防止了多個條件在for循環中? – Cloud

+0

您可以根據需要調用盡可能多的條件。只需添加更多的'if'行...(我會編輯我的答案,以包含更多信息) –

+4

你可以跳過分號在發生器和if-guard之間:'for(i < - 1 to 10 if i%2 = = 0)println(i)' –

1

模2條件可以移動到一個if從句。

object App {  
    def main(args: Array[String]) { 

    for (i <- 1 to 10) 
     if(i % 2 == 0) 
     Console.println("Counting " + i) 

    } 

} 
8
for (i <- 1 to 10 if i % 2 == 0) 
    println("Counting " + i) 
6

看看「按」的Range類的方法,通過2

object App {  
    def main(args: Array[String]) { 
    for (i <- 2 to 10 by 2) 
     Console.println("Counting " + i) 
    } 
} 

數或者像其他人已經指出,你可以解決你的循環做

object App {  
    def main(args: Array[String]) { 
    for { 
     i <- 1 to 10 
     if i % 2 == 0 
     } 
     Console.println("Counting " + i) 
    } 
} 

或另一種方式:

object App {  
    def main(args: Array[String]) { 
    val evenNumbers = for { 
     i <- 1 to 10 
     if i % 2 == 0 
     } yield i 
    Console.println(evenNumbers.mkString("\n")) 
    } 
} 
0

下面是一個簡單的例子;

for (i <- List(1, 2, 3) if i < 2) println(i) 

檢查代碼的最好方法是使用scala shell。

0

基本上,你正在嘗試使用循環+迭代器gaurd。請在以下語法

爲(ⅰ< - 1至10如果(ⅰ%2 == 0))產率我

+0

我不認爲你的答案是關於這個主題的第七個,這個主題增加了很多。 – Wndrr