「デフォルト引数」および「Unit 型を返す関数」
object HelloWorld {
def main(args: Array[String]): Unit = {
def myPrint(myArg: String = "default_value") = println(myArg + "!")
val result = myPrint() //=> default_value!
println(result) //=> () ← 他言語で void を意味する Unit 型
// 後述の「名前付きで引数を指定」と併用すると、第 N 引数のみを省略できる
def func(arg1: String = "abc", arg2: Int = 123): Unit = {
println("arg1 = %s, arg2 = %d" format (arg1, arg2))
}
func(arg2 = 999) //=> arg1 = abc, arg2 = 999
}
}
名前付きで引数を指定
object HelloWorld {
def main(args: Array[String]): Unit = {
def myFunc(a: Int, b: Int): Unit = {
println("a = %d, b = %d" format (a, b))
}
myFunc(b = 2, a = 1) //=> a = 1, b = 2
}
}
可変長引数
object HelloWorld {
def main(args: Array[String]): Unit = {
def myFunc(str: String, arg: Int*) = {
var i = 0;
val len = arg.length
while(i < len) {
println(str + arg(i))
i += 1
}
}
myFunc("hi", 1,2,3) //=> hi1 => hi2 => hi3
}
}
複数の値を返す
タプルを利用します。
object HelloWorld {
def main(args: Array[String]): Unit = {
def func: (Int, String) = {
return (123, "abc")
}
println(func) //=> (123,abc)
}
}
制御構造ブロックを引数として渡す
object HelloWorld {
def main(args: Array[String]): Unit = {
def myFunc(a: Int) = {
println(a)
}
myFunc {
val a = 1
val b = 2
a + b
}
}
}
無名関数
object HelloWorld {
def main(args: Array[String]): Unit = {
// 無名関数
val f = (i: Int) => {
i * 2
}
println(f(1)) //=> 2
// 無名関数化
def func(str: String): Int = {
str.size
}
val f2: (String) => Int = func
println(f2("hi")) //=> 2
}
}
関数を引数または返り値にとる関数
object HelloWorld {
def main(args: Array[String]): Unit = {
// 関数を返す関数
def func(): (String) => Int = {
(str: String) => {
str.size
}
}
println(func()("hi")) //=> 2
// 関数を引数にとる関数
def func2(f: (String) => Int, str: String): Int = {
f(str)
}
println(
func2(((str: String) => { str.size }), "hi") //=> 2
)
}
}
クロージャ
object HelloWorld {
def main(args: Array[String]): Unit = {
def func(i: Int): (String) => Int = {
(str: String) => {
str.size + i
}
}
println(func(1)("hi")) //=> 3
println(func(2)("hi")) //=> 4
}
}
引数の一部を固定した関数を生成
object HelloWorld {
def main(args: Array[String]): Unit = {
def func3(i: Int, j: Int): Unit = {
println(i + j)
}
val f1 = func3(1, _: Int)
val f2 = func3(_: Int, 1)
f1(1) //=> 2
f2(1) //=> 2
}
}
関数をローカル関数で分割して読み易くする
object HelloWorld {
def main(args: Array[String]): Unit = {
def func(i: Int): Unit = {
def innerFunc: Int = {
i*1
}
def innerFunc2: Int = {
i*10
}
val x = innerFunc
val y = innerFunc2
println(x + y) //=> 11
}
func(1)
}
}
カリー化
「引数が複数ある関数」を「引数がひとつの関数のチェーン」に変換することで、関数を引数にとる関数を可読性よく利用できます。
object HelloWorld {
def main(args: Array[String]): Unit = {
// カリー化
def func(i: Int)(j: Int): Unit = {
println(i + j)
}
val f = (i: Int) => (j: Int) => {
println(i + j)
}
func(1)(2) //=> 3
val tmp = func(1)_
tmp(2) //=> 3
f(1)(2) //=> 3
// 既存の関数をカリー化
def func2(i: Int, j: Int): Unit = {
println(i + j)
}
val f2 = (i: Int, j: Int) => {
println(i + j)
}
val f3 = (func2 _).curried
val f4 = f2.curried
f3(1)(2) //=> 3
f4(1)(2) //=> 3
// 関数を引数にとる関数をスマートに利用
// 関数に `{}` を引数として渡せることを利用しています。上記「制御構造ブロックを引数として渡す」をご参照ください。
def func3(str: String)(f: (String) => Int) = {
f(str)
}
println( //=> 2
func3("hi"){ str =>
str.size
}
)
}
}
引数のパターンマッチ
object HelloWorld {
def main(args: Array[String]): Unit = {
def func: (String) => Unit = {
case "abc" => {
println("hi")
}
case x => {
println(x)
}
}
func("abc") //=> hi
}
}
0
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- Scala 文字列の処理書式指定 object Main { def main(args: Array[String]): Unit = { println("%d + %d = %d".format(1, 1, 2)) //=> 1 + 1 = 2 } } 文字列の比較 ヒアドキュメント 他の言語でいう「ヒアドキュメント」のようなものは """ で囲うことで実現できます。 object Main ...
- Scala 日付に関する処理Date クラスを文字列にフォーマット import java.util.Date object Main { def main(args: Array[String]): Unit = { // format は Date に限らない文字列用の機能です。 println("%d-%d-%d" format (1, 1, 1)) //=> 1-1-1 printl...
- 酢豚の基本的な使い方 (sbt)sbt は Scala および Java を主な対象としたビルドツールです。Scala Build Tool の略ではありませんが、Simple Build Tool という明示的な記述も公式ドキュメントなどには見当りません。以下 sbt の基本的な使用例をまとめます。使用した sbt のバージョンは 0.13 です。 公式ドキュメント [sbt 0.13](http://www.scala-sb...
- Scala 組み込みの制御構造if-else 条件分岐で知られる if-else は三項演算子のようにも使用されます。 object HelloWorld { def main(args: Array[String]): Unit = { val myVal = if (!args.isEmpty) args(0) else "default" println(myVal) } ...
- Scala の基本文法Scala は JVM 上で動作するバイトコードにコンパイルできる言語です。JAVA よりも柔軟な記述ができます。事前にこちらからダウンロードおよびインストールしておいてください。基本的な文法をまとめます。 変数および定数 object HelloWorld { def main(args: Array[String]): Unit = { val constVal = 1 //