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
カッコを付けるのが面倒くさい。