Milk+ea

Weblog Is My Hobby.

Scalaのお勉強

最近Scalaを少し勉強し始めました。とりあえず入門書が1冊終わって何か作りたくなったので、カラーコードの16進値とRGB値を入替えるようなものを作ってみた。

コード

import scala.io._

def extract(value: String): List[String] ={
  val hexPattern = """#([\da-fA-F]{3,6})""".r
  val rgbPattern = """rgb\(\s?(\d{1,3}),\s?(\d{1,3}),\s?(\d{1,3})\)""".r
  value match {
    case hexPattern(value) => List(value) 
    case rgbPattern(r, g, b) => List(r, g, b)
    case _ => sys.error("おかしな値")
  }
}

def change(value: List[String]): String ={
  if( bool(value) ) {
    val values = value(0).toList
    values match {
      case List(r, g, b) => "rgb(" + decode(r, r) + ", " + decode(g, g) + ", " + decode(b, b) + ")"
      case List(r1, r2, g1, g2, b1, b2) => "rgb(" + decode(r1, r2) + ", " + decode(g1, g2) + ", " + decode(b1, b2) + ")"
      case _ => sys.error("値の桁がおかしい")
    }
  } else {
    "#" + Integer.toString(value(0).toInt, 16) + Integer.toString(value(1).toInt, 16) + Integer.toString(value(2).toInt, 16)
  }
}

def bool(length: List[String]): Boolean ={
  length match {
    case List(r, g, b) => false
    case List(value) => true
  }
}

def decode(value1: Char, value2: Char): String ={
  Integer.decode("0x" + value1 + value2).toString
}

val hexOrRgb = args(0)
val extractValue = extract(hexOrRgb)
val changeValue = change(extractValue)
println(changeValue)

結果

f:id:totora0155:20130508182058p:plain

「キタ━━━━(゚∀゚)━━━━!!パターンマッチすごい!!」