Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

Scalaにおける参照透過性がよく分かるサンプル

これはわかりやすかった。

scala> val x = "Hello,World"
x: String = Hello,World

scala> val x1 = x.reverse
x1: String = dlroW,olleH

scala> val x2 = x.reverse
x2: String = dlroW,olleH

x1とx2に変化はない。常に与えられた引数に対して等しい結果を返す。

でも、StringBuilderになると話が変わってくる。

scala> val sb = new StringBuilder("Hello")
sb: StringBuilder = Hello

scala> val sb1 = sb.append(",World").toString
sb1: String = Hello,World

scala> val sb2 = sb.append(",World").toString
sb2: String = Hello,World,World

ひぇ〜 sb1とsb2で値が違うじゃないですか。appendするとappend元のオブジェクトは自動的に差し替わるんだ。sb1がsbを上書きするような感じだね。これは気持ち的にはsbはHelloなんだからHello,Worldを返せよって思うわ。こういうのが副作用の一例か。なるほどなぁ...

あわせて読みたい

hamuhamu.hatenablog.jp