関数の宣言
Scalaでは、関数の宣言はdefキーワードを用います。次のような書式となります。
def 関数名[型パラメータ]( 引数名:引数型,・・・ ):結果型 = { 関数本体 }
例えば、Int型の引数nを受け取って、偶数の場合にはtrueを返すような関数は、このように定義できます。
scala> def isEven( n:Int ):Boolean = { | n % 2 == 0 | } isEven: (n: Int)Boolean scala> isEven( 3 ) res1: Boolean = false
さて、このisEven関数の結果型はBoolean型ですが、関数の結果はどのように返すのでしょうか?
Scalaでは、関数の本体で最後に評価された式の値が、その関数の返り値になります。isEven関数で最後に評価される式は、n % 2 == 0
です。これは、引数nを2で割ったあまりが0になるか(ようは偶数であるか)を判定するもので、結果はBoolean型ですので、isEven関数はBoolean型が返り値になります。
なお、REPL上では任意の箇所で関数を宣言できますが、実際のソースコード上では関数はいずれかのclassやオブジェクトに属する必要があります。
クラスの利用
Scalaは、Javaをベースとしたオブジェクト指向言語です。当然クラスを宣言して利用することができます。
さらに、ScalaではTraitを用いたMix-inや、シングルトンオブジェクトを定義できるobjectキーワードなど、Javaにない便利な機能があります。これらの詳細は次回以降に解説する予定です。
クラスの宣言はclassキーワードを利用して、次のように行います。
class Point( x:Int, y:Int ){ val pointX = x val pointY = y override def toString = "%d:%d" format (x,y) }
class Point( x:Int, y:Int )
のように、クラス名の後にはコンストラクタの引数を宣言します。これは、関数定義の引数と同様の書式です。
Scalaでは、クラスのコンストラクタはこのように宣言します。複数のコンストラクタを定義する方法は、次回以降に解説します。
クラスの本体で中でval/varキーワードを用いると、そのクラスのフィールドになります。デフォルトのアクセス修飾子はpublicです。
また、クラス定義の中でdefキーワードを利用して関数を宣言すると、そのクラスのインスタンスメソッドになります。Scalaには、staticな変数や関数はありません。
scala> val p = new Point( 10,20 ) p: Point = 10:20 scala> p.toString res5: String = 10:20 scala> p.pointX res6: Int = 10
このように、newキーワードでクラスのインスタンスを作成し、フィールドや関数にアクセスすることができます。