Fight the Future

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

ScalaのSnippetを写経する(10)-try catch

try-catchはJavaとほぼ一緒。
でもcatch句でcase使ってるってことはパターンマッチングなのかな??

Snippet: Sum Arguments | The Scala Programming Language

package sample.snippet

object TryCatchSample extends Application {

  var array = Array("1", "2", "3", "4")
  
  try {
    val elements = array map Integer.parseInt
    // foldRight returns f(a0, f(a1, f(..., f(an, z)...))) if the list is [a0, a1, ..., an].
    println("The sum of my array is: " + elements.foldRight(0) (
      (a, b) => {
        println("a:" + a)
        println("b:" + b)
        println("--")
        a + b
      }
    ))
  } catch {
    case e: NumberFormatException => println("The element of array need to be Int.")
    case e: RuntimeException => println("test")
  }
  
}

「変数名: 型」で判定してる感じ?ちなみにeでなくてもaでも何でもいける。ただの名前だしね。
なんじゃこりゃって思ったのはむしろfoldRightメソッドの方で。
このシリーズの写経は実は完コピではなくて、僕が勝手にいろいろ試してます。


foldRightの動作を確かめるために、foldRightの引数に渡した関数の引数を出力しました。
コードの意味から合計を計算してるし、おそらく配列の回数分呼び出されてるはずなので。


実行結果。

a:4
b:0
--
a:3
b:4
--
a:2
b:7
--
a:1
b:9
--
The sum of my array is: 10

第2引数(b)には最初foldRightに渡した0が入ってる。
そして配列の要素と加算していくけど、次のループでは前回の合計が第2引数(b)に入ってる。
なるほど。