Scala入門(1) HelloWorldとテスト

Scala?

凄いエンジニアの方と話しているときに、Scalaが良いという話を聞いた。 Scalaって名前は聞いたことあるけど、今流行りの関数型言語?とかいうやつ?IQ145の美女?くらいのイメージしか無かったので、家に帰ってから調べてみたら興味をそそられた。

Scalaは静的型付け言語で、関数型言語オブジェクト指向言語の中間らしく、JVM上で実行されるのでJavaのクラスを使えるらしい。というかインラインでJavaが書けるらしい。面白そう。しかもコードが洗練されててカッコイイ!

Javaのクラスが使えるということは、困ったときはJavaっぽく書いたら良いし、AndroidScalaで開発出来るらしいし、難しそうだけど関数型言語の勉強も出来て良いのでは!って思って始めてみることにした。

Scala使うための環境構築

このサイトを参考にさせてもらいながらScalaの環境を導入した。 IDEEclipseIntelliJの2択らしいけど、普段AndroidStudioを使ってるのでIntelliJにした。 blog.chopschips.net

HelloWorld

このサイトを参考に、とりあえずHelloWorldを作った。 thachinohe.hatenablog.com

作ったコードがそのまんまだけどこれ。

object HelloWorld {
  def main (args: Array[String]){
    println(createGreeting(args))
  }
  def createGreeting (args: Array[String]) = {
    args.headOption match {
      case Some(name) => "Hello" + name + "!"
      case None => "Hello!"
    }
  }
}

色々調べながらこのコードについて理解したことをメモっておくと、

  • ScalaにはObjectとClassが両方あって、ObjectはJavaでいうシングルトンクラスに相当。
  • match文はJavaのswitch文を強力にした感じのやつで、型ごとに処理を分けたり、case文の中にifを入れたり出来る。かなり便利そう。
  • Scalaにはプリミティブ型が存在しない。つまりint, long, double, string, byteとかは無い。オブジェクトのInt, Long, Double, String, Byteを使う。
  • プリミティブ型が無いので、+-*/%とかの演算子も実はメソッドとして定義されてる。

HelloWorldのTest

ScalaのテストにはScalaTestというのを使うのが一般的らしい。

ScalaTestを使うと様々な書き方でテスト出来るらしいが、僕はxUnit系に慣れてるので何となくFlatSpecを使った。

built.sbtを見ると、

scalaVersion := "2.11.6"

って書かれてたので、ScalaTest使うために

libraryDependencies += "org.scalatest" % "scalatest_2.11" % "2.2.4" % "test"

を追加した。

書いたテストコードがこれ。

import org.scalatest._

/**
 * Created by yuki on 5/16/15.
 */
class HelloWorldTest extends FlatSpec {
  "No argment" should "return Hello!" in {
    val greeting = HelloWorld.createGreeting(Array())
    assert(greeting == "Hello!")
  }

  "With argment" should "return HelloTest!" in {
    val greet = HelloWorld.createGreeting(Array("Test"))
    assert(greet == "HelloTest!")
  }
}

IntelliJでテスト動かすとこんな感じでテストが通った! f:id:yuki_tkd:20150517004528p:plain

参考になるか分からないけど、プロジェクト一式はGithubに置いてある github.com

これだけだと全然Scalaっぽくないし、これから勉強してラムダ式とかカリー化とかクロージャとか使うようなもっとScalaらしいコードを書いていきたい。