package jp.takeda_soft.examples /** 世界のナベアツに挑戦 テーマ:implicitによるScalaAPIの拡張 */ object Nabeatsu extends Application { //Intがバカになるメソッド"!"を追加 implicit def bakanize(n: Int) = new Bakanizer(n) //Int.!を1から40まで表示(99までどうぞ) //あえてyieldでワンクッション var nums = for( i <- 1 to 40 ) yield i! for( n <- nums ) println( n ) } /** Ruby風 to_s, to_i を拡張実装(適当です) もっとscala風な実装があるのではないだろうか。 */ class Rubynizer(n:Any) { def to_s = n.toString def to_i = { if( n.isInstanceOf[Char] ) n.asInstanceOf[Char].toString.toInt else if( n.isInstanceOf[String] ) n.asInstanceOf[String].toInt else throw new NumberFormatException() } } /** Intがバカになる拡張クラス */ class Bakanizer(n:Int) { /** Ruby風メソッドの導入 */ implicit def rubynize(n:Any) = new Rubynizer(n) /** なべあつ変換 */ def ! = baka(n) /** ! の実装 */ private def baka(n: Int): String = { if( n < 10 ) if( n % 3 == 0 ) ichi(n) else n.to_s else if( n < 99 ){ val s = n.to_s val k2 = s(0).to_i val k1 = s(1).to_i if( n % 3 == 0 || k2 == 3 || k1 == 3 ) ju(k2) + ichi(k1) else s }else throw new Exception("2桁まで") } private val ju:List[String] = List("","じゅ~","に~じゅ","さぁ~んじゅ","よぉ~んじゅ" ,"ごぉ~じゅ","ろぉくじゅ","しぃちじゅ","はぁ~ちじゅ","きゅ~じゅ") private val ichi:List[String] = List("","えぃち","にぃ","さぁん","しぃ","ごぉ" ,"ろぉく","ひぃち","はぁち","きゅ~") }