Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

ScalaのSnippetを写経する(7)-パターンマッチング

パターンマッチングのサンプル。実におもしろいw
Snippet: Maps | The Scala Programming Language

package sample.snippet

object PatternMatchSample {

  val colors = Map("red" -> 0xFF0000,
                   "turquoise" -> 0x00FFFF,
                   "black" -> 0xFFFFFF,
                   "orange" -> 0xFF8040,
                   "brown" -> 0x804000)
  
  println(colors getClass)
  
  def main(args: Array[String]) {
	    
	  val array = Array("red", "brown", "aaa")
	  
	  for(name <- array) {
	    println(
	      colors.get(name) match {
	        case Some(code) => name + " has code: " + code
	        case None => "unknown color: " + name
	      }
	    )
	  }
  }
}

Mapを生成。「キー -> 値」の形式。このへんはスクリプト言語と一緒(源流は関数型なの?)。
で、Arrayを生成してパターンマッチング。


要はMapにキーとして存在するか、で場合分けなんだけど、この辺が関数型らしいとこみたい。
matchのブロックの中がパターンマッチング。
caseってあるからswitch-caseをイメージするかもだけど、パターンマッチングの方がスゲー柔軟。


突然出てくるSomeとNoneって何?
処理としてはMapにキーとしてあればSomeのケース、なければNoneのケースってイメージはできるけど。


調べてみた。

Option[T] は Some[T] と None というサブクラスのみを持つジェネリック・クラスであり、「値がない」可能性を伝えるために使われます

多忙な Java 開発者のための Scala ガイド: コレクション型

Scala の Map に対する get の戻り値が、渡されたキーに対応する実際の値ではないことに注意してください。この戻り値は Option[T] インスタンス (対象としている値をラップする Some() か、あるいは None) であり、これによってその渡されたキーがマップの中に見つからなかった場合にそのことが明確にわかります。これが特に重要となるのは、指定されたキーがマップの中に存在し、しかもキーに対応する値としてヌルを持つことが受け入れられる場合です

多忙な Java 開発者のための Scala ガイド: コレクション型

scaladocより。

class HashMap[A, B]

get (key : A) : Option[B]
Check if this map maps key to a value and return the value if it exists.

なるほど。値としてnullなのか値がなくてnullなのかのような人間の判断をなくしてくれるわけだ。
さらにOptionクラスにgetメソッドがあって、実際の値を取り出すこともできる。


実行結果。

class scala.collection.immutable.HashMap$$anon$1
red has code: 16711680
brown has code: 8404992
unknown color: aaa

わからないこと

matchって何者?メソッドじゃないし、構文ってことなのかな?