Fight the Future

Java言語とJVM、そしてJavaエコシステム全般にまつわること

IT勉強会での初プレゼンなどお助けします!

勉強会でスピーカーをやりたいけど、プレゼンが初めて、苦手という方に無償でコーチできます。スライドのレビューや録画したリハへのアドバイスなどなど。Twitter@jyukutyoまでメンションでもDMでもお気軽にご連絡ください。

私はIT講師の経験があり、プレゼンはデブサミやJJUG CCCなど200人規模の経験が豊富で最大800人の前でプレゼンしました。海外ではDevoxxUSで。デブサミ2017では公募スピーカー1位、デブサミ関西2012アワードで5位となりました。

ScalaのSnippetを写経する(4)-For and Yield

Snippet: For and Yield | The Scala Programming Language

yieldしたら処理後のものを戻しますよーというサンプル。

package sample.snippet

object YieldSample extends Application {

  val array = Array("a", "b", "c")
  println("変換前" + array.toString)
  
  val res = for (arg <- array) 
    yield arg toUpperCase
      
  println("変換後" + res.toString)
}

ScalaRubyとかと同じで、return文を書かなくても最後に評価した式を戻す。


実行結果。

変換前Array(a, b, c)
変換後Array(A, B, C)

a.toStringとa toStringの出力が異なる!?

ところで、僕の環境だとres.toStringじゃなくres toStringと書くとこういう出力になってしまう。

変換前[Ljava.lang.String;@8e2b22
変換後[Ljava.lang.String;@f934ad

本来意味は同じのはずだけど。。。eclipse3.4.0(Mac OS) + Scala plugin2.7.2RC3
ターミナルからscalaコマンドでインタラクティブに入力して実行したときは問題なし。
プラグインの問題なのだろうか。。。

(追記)
呼び出し順序の問題だけでした。
println("変換後" + res toString)だと、"変換後" + resした結果をtoStringしちゃう。
println("変換後" + res.toString)だと、ドットで呼び出し順序がわかるからres.toStringした結果と文字列を結合する。