Scala入門

コップ本高すぎるし、逆引きも良いと聞くが、Scalaを仕事で触ることはおそらく無いので出費しない。
qiita.com
をやっていく。
Play2.4xでCRUDできるところぐらいまでを目標にしていきたい。
Play2.4は英語の公式ドキュメント読まないといけないんだろうなぁ。めんど

本当の基本のキ

;いらない
{ }とかもかなり省略できる
:戻り値も省略できる
return 省略できる。

型推論とか付いていて戻り値の型も省略できるけどインターネットの人が「保守できね!」と言ってたので戻り値の型は書いたほうが良いのであろう

main関数の作り方

def main(args:Array[String]){
  println("a main")
}

メソッド

def メソッド名(変数名:型):戻り型 = { 
  hoge :戻り型 = "hoge"
  return hoge // return省略可能。rubyとかとおんなじ感触
}
// 関数の中身が一行だと
def hoge():Unit = fuga()
// で行ける

UnitがVoidにあたる

関数

var hoge = (x:Int) => { 
  fuga()
  h()
  (x:Int) => { 
    // 無名関数
  }
}

もちろん関数はファーストクラス

シングルトンインスタンス

objectというのがありましてね。シングルトンインスタンスと言います。クラス定義かつインスタンスです。JavaとかRubyとかPHPにはない概念ですね。多分。ちょっと注意。

クラス

すごく簡単に書けます。getter/setterとはおさらばです。というか最近の言語って隠蔽について考え方がゆるくなってきているとおもいますね。

/**
 * クラス
 */
class Car(val color:String){
  def run = println("rrrrrun" + color)
}
/**
 * 継承
 */
class Truck(color:String) extends Car(color){
  override def run = println("Truck Start!!!")
}
priavteなコンストラクタ

qiita.com

class Foo private (name: String) {
case class

便利な機能をいろいろつけてくれるらしいぞっと。よくわかっていない。なにも言及なしにタプルの説明の時にこういうの書かされた。

object CaseClassTuple {
  def get() = {
    val name = new Name("清見","椿山")
    (Human(name,15),name)
  }
  
  def main(args:Array[String]){
    var tuple = get()
    println(tuple._1.name.fullname())
    println(tuple._2.fullname())
  }
}

class Name(first:String, last:String) {
  def fullname() = first + " " + last
}

case class Human(name:Name, age:Int)
コンパニオンオブジェクト/コンパニオンクラス

同じ名前のclassとobjectは互いにprivateにアクセス可能

/**
 * コンパニオンオブジェクト
 * 互いにprivateにアクセス可能
 */
object Car {
  def main(args:Array[String]){
    var car = new Car("blue")
    car.run
    
    val truck = new Truck("red")
    truck.run
    
    out(car)
    out(truck)
  }
  private def output(mes:String):Unit = println(mes)
  def out(car:Car):Unit = println(car.color)
}

/**
 * コンパニオンクラス
 * 互いにprivateにアクセス可能
 */
class Car(val color:String){
  def run = Car.output("rrrrrun" + color)
}

型とかデータ構造編

このあたりのはじめあたりまで読んだ。

tuple

Pythonのアレ。Swiftにもあった。

// Tuple
object Tuple {
  def getMaxValueAndIndex(numbers:List[Int]):(Int,Int,Int) ={
    val max = numbers.max
    val index = numbers.indexOf(max);
    return (max,index,2)
  }
  
  def main(args:Array[String]){
    val numbers = List(1,3,4,44,5,3,3,22,3232,4)
    val maxValue = getMaxValueAndIndex(numbers)
    println(maxValue._1)
    println(maxValue._2)
  }
}

あんまり馴染み無いのよね。JavaDTOの時もそうだったけど。ずっとarray/hashに突っ込んで返す
というPHPer/Rubyistだったので。
returnを明示的に書くとメソッドの戻り型を明示しないとEclipseちゃんに怒られる。

タプルのメリット
型の増大を防ぐことができるのがメリットだと思うよ。
特に、サービス層で使える気がしている。

そうね。でもJavaの人はDTO作りたがるのよね。多分。

開発環境

ideaが良いと聞くが、Eclipse+Emacsキーバインドでやってる。ensime+Emacsとかも視野に入れたけれど結局大規模なプロジェクトになるとコンパイルどうするの問題がある気がしてね。まぁ、EclipaseのScalaプラグインもそこまでこなれてはいないけれどEmacsキーバンドがあれば我慢できない程ではない。

おしまい

今日はここまで。ねむくてねむくて。