根無し草日記

好きな事についての雑記帳

scalaの基本を学ぶ

scalaの名前はscalableなプログラミング言語というのが由来になっている。scalableとは、小規模から大規模なプロジェクトまでサポートすることを意味する。大規模なプロジェクトになると、ソースファイルも膨大になり、管理も煩雑になる。その様なファイル管理やビルドを楽に自動化してくれるツールがsbtであったりEclipseの様なIDEがある。が、何をやってるか理解せずに自動化ツールを使うのは後々の事を考えると良くない気がする。先ずは小規模なスクリプトとして使ってみるのが良いと思う。と言う事で基本的な文法を理解するまではsbtは使わずにscalacコマンドとscalaコマンドを使って勉強して行く事にする。

 

 

改めてhello world!

sbtはインストールしたのにscalaと打ってもコマンドが無いと怒られた。

以下のサイトを参考にしてscalaを入れ直す。

入門 | Scala Documentation

実行すると、sbtも入れている気配がする。

どうやらこれを入れるとsbtも入るらしい。なら最初からこのサイトを参考にすれば良かったと思わなくも無い。依存関係でおかしくならないか不安だが、とりあえず困ってから考えよう。

Hello Worldとして、下記のコードを記述する。

 

<hello.scala>

object Hello extends App{
  println("Hello World!")
}

 

コマンドとしては以下を打つと実行結果は以下の様になった。

>>scala hello.scala Scala
Hello World!

出来ていそうだ。

 

日本版FizzBuzz

プログラミングを学習するときの有名な題材にFizzBuzz問題というのがある。英語圏の飲み会とかで行われる山手線ゲームみたいなものらしく、数字をカウントして行き、3の倍数ならFizz

5の倍数ならBuzz、15の倍数ならFizzBuzzというのがルールらしい。とは言え、日本人には馴染みが無いゲームなので近くてイメージが付きやすいものを題材にする。そう、世界のナベアツである。

世界のナベアツを作る

数字を40まで数えて、3の倍数か数字に3が含まれるときはアホになる。

早速この動作を実装して行く。

object Nabeatsu extends App{
  println("Count Start")
  for(count <- 1 to 40){
    if(count % 3 == 0 || count.toString.matches(".*3.*")){
      println("(^ o ^ )/ %d".format(count))
    }
    else{
      println("count %d".format(count))
    }
  }
}

実行結果

>> scala nabeatsu.scala Scala
Count Start
count 1
count 2
(^ o ^ )/ 3
count 4
count 5
(^ o ^ )/ 6
count 7
count 8
(^ o ^ )/ 9
count 10
count 11
(^ o ^ )/ 12
(^ o ^ )/ 13
count 14
(^ o ^ )/ 15
count 16
count 17
(^ o ^ )/ 18
count 19
count 20
(^ o ^ )/ 21
count 22
(^ o ^ )/ 23
(^ o ^ )/ 24
count 25
count 26
(^ o ^ )/ 27
count 28
count 29
(^ o ^ )/ 30
(^ o ^ )/ 31
(^ o ^ )/ 32
(^ o ^ )/ 33
(^ o ^ )/ 34
(^ o ^ )/ 35
(^ o ^ )/ 36
(^ o ^ )/ 37
(^ o ^ )/ 38
(^ o ^ )/ 39
count 40

異世界のナベアツを作る

この世界のナベアツは3の時と数字に3が含まれるときだった。落語家としての名前も桂三度である。だけど、異世界には桂四度が居るかも知れないし、桂九度だって居るかも知れない。と、言う事で桂N度を作ってみよう。

先程の処理をCOUNTという関数に定義し、Nという引数で桂N度を作る。

最後にN = 4として実行する。

object Nabeatsu extends App{
  val COUNT = (N:Int)=>{ // COUNTと言う関数を定義する。
    println("Count Start")
    for(count <- 1 to 40){
      if(count % N == 0 || count.toString.matches(".*%s.*".format(N.toString))){
        println("(^ o ^ )/ %d".format(count))
      }
      else{
        println("count %d".format(count))
      }
    }
  }
  COUNT(4) // その関数を使う。今回はN = 4とする。
}

実行結果

>> scala nabeatsu2.scala Scala
Count Start
count 1
count 2
count 3
(^ o ^ )/ 4
count 5
count 6
count 7
(^ o ^ )/ 8
count 9
count 10
count 11
(^ o ^ )/ 12
count 13
(^ o ^ )/ 14
count 15
(^ o ^ )/ 16
count 17
count 18
count 19
(^ o ^ )/ 20
count 21
count 22
count 23
(^ o ^ )/ 24
count 25
count 26
count 27
(^ o ^ )/ 28
count 29
count 30
count 31
(^ o ^ )/ 32
count 33
(^ o ^ )/ 34
count 35
(^ o ^ )/ 36
count 37
count 38
count 39
(^ o ^ )/ 40

出来ていそうだ。

 

ナベアツは落語も出来る

先程も少し触れたが世界のナベアツは現在は落語家に転身されている。と、言う事で先程は数字をカウントするメソッドを作ったが、寄せで自己紹介するメソッドも追加してみる。

object Test extends App{
  val Nabeatsu = new Nabeatsu() // ナベアツクラスのインスタンス化
  Nabeatsu.yose(3) // 寄せのメソッドを使う。
  Nabeatsu.count(3) // カウントのメソッドを使う。
}

class Nabeatsu { //ナベアツクラスを作る。
  def yose = (N:Int)=>{ // 寄せで自己紹介するメソッドを定義する。
    println("どうも〜、桂%d度です〜".format(N))
  }

  def count = (N:Int)=>{ // countと言うメソッドを定義する。
    println("Count Start")
    for(count <- 1 to 40){
      if(count % N == 0 || count.toString.matches(".*%s.*".format(N.toString))){
        println("(^ o ^ )/ %d".format(count))
      }
      else{
        println("count %d".format(count))
      }
    }
  }
}

実行結果

free/ >> scala nabeatsu3.scala Scala
どうも〜、桂3度です〜
Count Start
count 1
count 2
(^ o ^ )/ 3
count 4
count 5
(^ o ^ )/ 6
count 7
count 8
(^ o ^ )/ 9
count 10
count 11
(^ o ^ )/ 12
(^ o ^ )/ 13
count 14
(^ o ^ )/ 15
count 16
count 17
(^ o ^ )/ 18
count 19
count 20
(^ o ^ )/ 21
count 22
(^ o ^ )/ 23
(^ o ^ )/ 24
count 25
count 26
(^ o ^ )/ 27
count 28
count 29
(^ o ^ )/ 30
(^ o ^ )/ 31
(^ o ^ )/ 32
(^ o ^ )/ 33
(^ o ^ )/ 34
(^ o ^ )/ 35
(^ o ^ )/ 36
(^ o ^ )/ 37
(^ o ^ )/ 38
(^ o ^ )/ 39
count 40

出来ていそうだ。

 

今回学んだ事のまとめ

今回はscalaの基本的な文法を世界のナベアツを題材にして学んだ。sbtを使わずにscalaコマンドを使う事でオブジェクトやクラスの仕組みを学んだ。必要な事はその都度検索する事にはなるものの、ある程度プログラミングで何かが作れるようにはなった筈。最後に学んだ事を以下にあげる。

  • scalaコマンドによる実行方法(Hello World)
  • for文の使い方
  • if文の使い方
  • printlnの中に数字を入れ込む方法(formatの使い方)
  • IntをString型に変換する方法
  • 正規表現の使い方(match)
  • 関数の作り方
  • クラスの作り方

Scala逆引きレシピ すぐに美味しいサンプル&テクニック300 (Programmer’s recipe) [ 竹添直樹 ]

価格:3,520円
(2023/6/8 07:27時点)
感想(0件)