読者です 読者をやめる 読者になる 読者になる

Scala今週のまとめ [名前渡し]

Scala

便利だなぁと思った機能や、わけ分かんないよ><と思って調べたことを、自分用にメモしていこうと思います。
来週以降続くかどうかは不明。

名前渡し

本を読む → コードを読む → 「名前渡しって誤訳なんじゃね?」
と、大変失礼なことを考える。小学生並みの(ry
"call by name"なので、どう考えても「名前渡し」です。本当に(ry

いろいろ試してみましたが、ソースを見て理解するのが一番分かりやすいんじゃないかと。

  • 普通の値渡し(実際は参照渡しなのかも?)
class Foo(name: String) {
	def getName() = {
		println("Hello")
		name
	}
}

object Main {
	def call_by_value(f: String) {
		println("before")
		println(f)
		println(f)
		println(f)
		println("after")
	}
	
	def main(args: Array[String]) {
		val foo = new Foo("abc")
		call_by_value(foo.getName())
	}
}

出力

Hello
before
abc
abc
abc
after

  • 名前渡し
class Foo(name: String) {
	def getName() = {
		println("Hello")
		name
	}
}

object Main {
	def call_by_name(f: => String) {
		println("before")
		println(f)
		println(f)
		println(f)
		println("after")
	}
	
	def main(args: Array[String]) {
		val foo = new Foo("abc")
		call_by_name(foo.getName())
	}
}

出力

before
Hello
abc
Hello
abc
Hello
abc
after

  • おまけ:関数を引数にするだけ
class Foo(name: String) {
	def getName() = {
		println("Hello")
		name
	}
}

object Main {
	def call_by_name(f: () => String) {
		println("before")
		println(f())
		println(f())
		println(f())
		println("after")
	}
	
	def main(args: Array[String]) {
		val foo = new Foo("abc")
		call_by_name(() => foo.getName())
	}
}

出力

before
Hello
abc
Hello
abc
Hello
abc
after

カッコを付けるのが面倒くさい。