3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

変数定義、関数定義、関数リテラル

Last updated at Posted at 2015-05-09

はじめに

この記事では、Scala の変数定義、関数定義、関数リテラルを紹介します。

変数の定義

変数を定義する方法は2つあります。

1つはvalを使う方法、もう一つはvarを使う方法です。

valを使う方法で変数を定義すると、初期化後に再代入できない変数を定義することができます。

varを使う方法で変数を定義すると、初期化後に再代入できる変数を定義することができます。

また、Scala には型を推論する仕組みがあり、大抵、型を省略することもできます。

順番に見てみましょう。

変数定義

object Main extends App {
    val fruit: java.lang.String = "apple"
}

型を省略した変数定義

型を省略できることを確認してみましょう。

object Main extends App {
    val fruit = "apple"
}

val で再代入できないことを確認

valで初期化後に再代入できないことを確認してみましょう。(コンパイルエラーになります。)

object Main extends App {
    val fruit = "apple"
    fruit = "carrot"
}

var で再代入できることを確認

varで初期化後に再代入できることを確認してみましょう。(コンパイルエラーになりません。)

object Main extends App {
    var fruit = "apple"
    fruit = "carrot"
}

関数の定義

関数の定義はdef、関数名、(、パラメータリスト、):、関数の結果型、={、関数の本体、}からなります。Scala の関数定義は他の言語の関数定義とほとんど同じですが、関数の結果型がパラメータリストの後にあることや、イコール(=)があることが目新しいかもしれません。

また、場合によっては、中括弧を省略したり、関数の結果型を省略したりすることができます。

順番に見てみましょう。

一般的な関数定義

object Main extends App {
    def product(x: Int, y: Int): Int = {
        x * y
    }
    println(product(3, 5))
}

中括弧を省略した関数定義

関数の本体が1文であるときに、中括弧を省略することができます。

object Main extends App {
    def product(x: Int, y: Int): Int = x * y
    println(product(8, 9))
}

関数の結果型を省略した関数定義

関数の結果型がUnit型であるときに、関数の結果型を省略することができます。(関数が値を返さないとき、つまり副作用を目的とした関数であるとき、関数の結果型がUnit型になります。)

object Main extends App {
    def greet(name: String) { println(s"hello, $name") }
    greet("Bob")
}

副作用があることを明示するために、手続き型プログラミングのように実装します。

関数リテラル

リテラルとは、即値のことです。Scala には、整数リテラルの1とか、文字リテラルの'a'とか、文字列リテラルの"hoge"とかと同じように、関数にもリテラルがあります。

関数リテラルは(、パラメータリスト、)=>{、関数の本体、}からなります。関数と同じように、場合によっては、中括弧を省略することができます。(中括弧を省略する以外にも構文のパーツをいくつか省略することができます。)

また、関数リテラルを利用して、クロージャーを実装することができますが、この記事ではクロージャーについては紹介しません。

順番に見てみましょう。

一般的な関数リテラル

object Main extends App {
    Seq(13, 8, 5).map((x: Int) => {
        println(x)
    })
}

中括弧を省略した関数リテラル

関数の本体が1文であるときに、中括弧を省略することができます。

object Main extends App {
    Seq(13, 8, 5).map((x: Int) => println(x))
}

さらに省略した関数リテラル

レシーバがSeq(13, 8, 5)であることから、関数リテラルのパラメータの型を推論することができるケースでは、さらに省略することができます。

object Main extends App {
    Seq(13, 8, 5).map((x) => println(x))
    Seq(13, 8, 5).map(x => println(x))
    Seq(13, 8, 5).map(println)
}

まとめ

変数定義、関数定義、関数リテラルを紹介しました。

今回紹介した内容は基本的な構文なので、需要がないかもしれませんが、これから Scala を始める人に読んでいただければと思っています。

動作確認にはブラウザでプログラミング・実行ができる「オンライン実行環境」| paiza.IOを利用しました。

参考

  • Scala スケーラブルプログラミング [第2版]
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?