技術のメモ箱

Scala/関数

関数

関数

戻り値の型は省略可能。再帰的な場合は省略不可。引数の型は省略不可。
戻り値は、最後に評価した結果。
引数なしのメソッドの場合、一般的に推奨される慣習では、副作用がある場合は()を付ける

def greet() = println("Hello, world!")
def max(x: Int, y: Int): Int = { if (x > y) x else y }

アクセス修飾子のデフォルトはpublic。privateはクラス外からのアクセスを防ぐ。 publicメソッドは結果型を明示的に提示することを推奨する。

override def toString = n + "/" + d  // デフォルトはjavaのObjectクラスのtoStringを呼び出す

標準ライブラリに対しメソッドを定義したい場合、暗黙の型変換で同じようなことができる。

implicit def intToRational(x: Int) = new Rational(x) // 2 * rをしたいときに、2をIntからRationalに変換できる。

連続パラメータ

連続パラメータを使えば、可変長引数リストを渡せる。

def echo(args: String*) = for (arg <- args) println(arg)  // 0個以上のString引数

この引数は内部的にはArray型だが、引数にArray型を指定するとエラーになる。

val arr = Array("What's", "up", "doc?")
echo(arr)  // エラー!
echo(arr: _*)  //OK!1個の引数として渡すのではなく、個々の要素を渡すようになる

名前付き引数

デフォルト引数値との組合せで使われることが多い。

def speed(distance: Float, time: Float):Float = distance / time
speed(time = 10, distance = 100) // 引数の順序を変えられる

パラメータのデフォルト値

def printTime(out: java.io.PrintStream = Console.out, divisor: Int = 1) =
  out.println("time = " + System.currentTimeMillis() / divisor)
printTime(out = Console.err)
printTIme(divisor = 1000)
pagetop