libro
www.tuyano.com
初心者のためのPlay Framework入門

30分でわかる(かも知れない)Scala超々入門! (6/8)

作成:2013-01-10 08:24
更新:2013-01-10 08:24

■メソッド・関数について

メソッド・関数は、JavaとScalaで大きく異る部分でしょう。Javaでは、処理はクラス内のメソッドとして定義されましたが、Scalaでもこの点は同じです。これは以下のような形で記述します。
def メソッド (引数): 型 = {
    ……実行する処理……
}
メソッド名・引数・必要に応じて返り値の型名といった要素を記述して定義をします。既にmainメソッドというメソッドを書いて使っていますね。基本的な書き方の違いさえ押さえれば、Javaプログラマにとってメソッドの利用はそう大変なことではありません。

が、Scalaでは、Javaとは大きく異なる点があります。それは、処理をメソッドとして定義する他に、「関数オブジェクト」というオブジェクトとして扱うこともできる、という点です。関数を値として変数に入れて利用したりできるのです。

関数オブジェクトを値として利用する場合には、以下のような形で利用します。
変数 = ( 引数の定義 ) => ……処理……
変数:(引数の型) => 返り値の型 = (引数の定義) => ……処理……
単純に関数をオブジェクトとして変数などに代入するのであれば、1つ目の書き方で十分です。Javaのジェネリックのように、引き渡すそれぞれの値の型を明示的に指定したい場合には後者のような書き方ができます。

このへんは、実際にスクリプトを見て考えないと理解し難いかも知れません。簡単なサンプルを挙げておきましょう。
import java.util._

object myapp {

    def main(args: Array[String]) = {
        val rnd = new Random
        val n = rnd.nextInt(100)
        println(n + "までの合計:" + total(n))
    }

    def total(num: Int) = {
        var res:Int = 0
        for(n:Int <- Range(1,num + 1))
            res += n
        res
    }
}
これは、引数に指定した値までの合計を計算して返すメソッドtotalを定義し利用する例です。def ~で定義をするメソッドは、Javaと同様、オブジェクトやクラスの中に用意をします。mainで、totalを呼び出していることがわかるでしょう。

では、今度は「関数オブジェクトを変数に入れて利用する」という形に書き直してみましょう。totalメソッドを関数オブジェクトとして扱えるようにします。
import java.util._

object myapp {

    def main(args: Array[String]) = {
        val total = (num: Int) => {
            var res:Int = 0
            for(n:Int <- Range(1,num + 1))
                res += n
            res
        }
        val rnd = new Random
        val n = rnd.nextInt(100)
        println(n + "までの合計:" + total(n))
    }
}
ここでは、val totalという形で定数を用意し、これに関数オブジェクトを代入しています。printlnにあるtotal(n)は、「変数totalに収められている関数を呼び出す」という意味に変わります。関数はオブジェクトとして変数に入れてやり取りしたりできることがわかります。

また、この関数オブジェクトは、メソッドのように特定のクラスやオブジェクト内に組み込まれているわけではありません。変数として、それがあるクラスなどとは無関係に存在できますから、明らかにメソッドとは違うものであることがわかりますね。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

●リスト1
import java.util._

object myapp {

    def main(args: Array[String]) = {
        val rnd = new Random
        val n = rnd.nextInt(100)
        println(n + "までの合計:" + total(n))
    }

    def total(num: Int) = {
        var res:Int = 0
        for(n:Int <- Range(1,num + 1))
            res += n
        res
    }
}


●リスト2
import java.util._

object myapp {

    def main(args: Array[String]) = {
        val total = (num: Int) => {
            var res:Int = 0
            for(n:Int <- Range(1,num + 1))
                res += n
            res
        }
        val rnd = new Random
        val n = rnd.nextInt(100)
        println(n + "までの合計:" + total(n))
    }
}
※関連コンテンツ

「初心者のためのPlay Framework入門」に戻る