2010-02-06 43 views
11

非常方便Ruby代碼:Scala相當於Ruby的map.each?

some_map.each do |key,value| 
    # do something with key or value 
end 

斯卡拉相當於:

someMap.foreach(entry => { 
    val (key,value) = entry 
    // do something with key or value 
}) 

不必增加額外val線我的錯誤。我無法弄清楚如何聲明函數arg來提取元組,所以我想知道有沒有辦法做到這一點,或爲什麼沒有foreach提取我的鍵和值?

回答

19

這工作,也:

someMap.foreach {case (key, value) => 
    // do something with key and/or value 
} 
+0

case語句實際上是一個僞裝的部分函數,​​這就是爲什麼這個方便的分解速記正常工作。這可能有助於那些由於這種表達不匹配導致的類型錯誤迷惑的人。 –

+0

關於部分函數的好文章http://ebruchez.blogspot.com/2011/10/scala-partial-functions-without-phd.html – foolshat

11

我喜歡這一個:

scala> val foo = Map(1 -> "goo", 2 -> "boo") 
foo: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> goo, 2 -> boo) 

scala> for ((k,v) <- foo) println(k + " " + v) 
1 goo 
2 boo 
+0

'for'生成器內不需要'val'。 –

5

你不需要即使在for循環val

繼ViktorKlang的例子:

scala> val foo = Map(1 -> "goo", 2 -> "boo") 
foo: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> goo, 2 -> boo) 

scala> for ((k, v) <- foo) println(k + " " + v) 
1 goo 
2 boo 

需要注意的是for是Scala相當強大,所以你也可以用它來sequence comprehensions

scala> val bar = for (val (k, v) <- foo) yield k 
bar: Iterable[Int] = ArrayBuffer(1, 2) 
+0

'for'實際上是一個僞裝成'for'循環的Monad Comprehension,所以不會用諸如* Monad *的概念嚇跑Java程序員。 (就像查詢在C#/ VB.NET中的理解一樣,monad理解爲SQL查詢)。所以它比序列理解更強大。 –

+1

Jörg,不要用M字,它嚇人;-) –

+0

@ViktorKlang:的確!這就是爲什麼Martin Odersky將它們僞裝成Java程序員已經知道的東西:for循環。 Erik Meijer將它們僞裝成C#和VB.NET中的SQL查詢,Don Syme將它們僞裝成F#中的Unix shell管道,Simon Peyton Jones將它們僞裝成Haskell中的C塊。 (有時候我認爲如果他們不是經常躲在陰影裏,他們會*少*嚇人) –

2

Function.tupled功能(a1, a2) => b)轉換爲功能((a1, a2)) => b

import Function._ 
someMap foreach tupled((key, value) => printf("%s ==> %s\n", key, value))