ScalaでFizzBuzz(Scalaことはじめ)

この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります

(ことはじめ、って書いておいたらたぶん叩かれることはないだろうと思って・・・)

ScalaでFizzBuzz書いてみる

まだまだScalaは書き慣れないのですが、この前の1/11になごやかScala #8にて

『ScalaでFizzBuzzの例題を、パターンマッチで書いてみるといいよ!』

と聞いたので、がんばって色々書いてみようと思いました。

まず最初に書いたもの

object FizzBuzz {
  def fizzbuzz(n: Int):String = n match {
    case x if x % 15 == 0 => "fizzbuzz"
    case x if x % 3 == 0 => "fizz"
    case x if x % 5 == 0 => "buzz"
    case x => x.toString
  }

  def main(args: Array[String]) = {
    (1 to 100).toList.foreach{ n =>
      println(fizzbuzz(n))
    }
  }
}
  • とりあえず思いつくままに書いてみたもの
  • 副作用うんぬんってところは前に聞いていて気をつけなきゃと思っていたので、数字を受け取って文字列を返す形に統一した(中でprintlnとか書かない)
  • 変数 x のところは最初 n って書いてたけど、『パターンマッチで別の変数を割り当てられるよー』ってところを分かりやすくするために x にしてみた

うーん、素人目でも分かるように、無駄が多そうですね。

特にmainの中がなんかごちゃごちゃしてる気がするので、ここからもうちょっとすっきりするように書き直してみます。

次に書いてみたもの

object FizzBuzz {
  def fizzbuzz(n: Int):String = n match {
    case x if x % 15 == 0 => "fizzbuzz"
    case x if x % 3 == 0 => "fizz"
    case x if x % 5 == 0 => "buzz"
    case x => x.toString
  }

  def main(args: Array[String]) = {
    (1 to 100).map(fizzbuzz).foreach(println)
  }
}
  • そもそも Range に対して toList してから、みたいなのは不要っぽい
  • foreachの戻り値はUnit型(戻り値がないことを意味する戻り値)らしいので、何かそのまま返してくれるやつを使うべき? -> map ぽかったので変更
  • 最後 println するとこは何も返さなくてよいので foreach のまま

これでよいのかな?まだまだ慣れないけど、

  1. 1から100のリストを作り、
  2. fizzbuzzに変換して、
  3. それぞれ出力する

っていう流れは main 見るだけでざっと分かるようになっているんじゃないかと思いました。 これって、main見るだけでざっと処理全体が分かる ≒ 概要、アウトラインを意味するように書けば良いのでは?って少し思いました。

まだまだ道のりは長そうです・・・。

この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります

もし記事内に誤りなどございましたら、 @girigiribauer @girigiribauer.com までご一報いただけると助かります。

Related articles