2010年03月25日 01:03

Scalaのメモ その3 関数・演算子

Scalaのメモその2の続き。



関数に返値がない場合、Javaと違って、ScalaではUnitと書く。Javaのvoidと同じ意味かどうかは不明。
def summation(n: Int): Unit = {
	var sum = 0;
	for(index <- 1 to n){
		sum += index;
	}
	println(sum);
}
summation(100);



Unit の場合は、返値型と中括弧 { の前のイコールを省略できる。
def summation(n: Int){
	var sum = 0;
	for(index <- 1 to n){
		sum += index;
	}
	println(sum);
}
summation(100);



引数のない関数呼出は、() を省略できる。副作用を目的とした関数呼び出しは () を省略せず、副作用がなく返値の取得を目的とした関数呼び出しは、() を省略するのがScalaの慣例らしい。
def summation(){
	println(5050);
}
summation;
summation();

副作用のない引数のない関数呼び出しで () を省略する慣例となっているのは、プロパティを取得する方法の実装をメソッドからフィールドに変更しても、それを利用する側のソースコードを変更しなくてもすむように、らしい。例えば、文字列の長さを取得するのは、Javaでは str.length() だが、Scalaでは str.length でもよい。長さの取得がメソッドかフィールドなのかは覚えている必要がない。Javaの配列の長さは arr.length であて、arr.length() でないのは、非常に紛らわしい。() が必要かどうかを覚えるのは手間だ。



for文で使う toIntで定義されているメソッドの扱いらしい。toメソッドの返値は範囲を表す scala.Rainge.Inclusive というクラスのオブジェクト。untilメソッドも同様。以下の4つの例は全部同じ動きをする。
for(i <- 1 to 10){
	out.println(i);
}
val range = 1 to 10;
for(i <- range){
	out.println(i);
}
for(i <- (1).to(10)){
	out.println(i);
}
val range = (1).to(10);
for(i <- range){
	out.println(i);
}



引数が1つのメソッドは、2項演算子と同じ構文で呼び出せる。逆に2項演算子はメソッドの構文でも呼び出せる。2項演算子はメソッドとして定義されている。1 + 2(1).+(2) と同じでシンタックスシュガーに過ぎない。1 to 10(1).to(10) と同じなのもこの理屈による。



2010/03/27追記
その4に続く
タグ:scala
カテゴリ:テック
2010/03/25 Thu 01:03 | Comment(0) | TrackBack(0) | テック | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/144558696
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。