その他
    ホーム 技術発信 DoRuby rubyistのためのscala (2) 制御構造

    rubyistのためのscala (2) 制御構造

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。


    Rubyで書くあれはScalaだとどう書くの?シリーズ。 今回は制御構造です。

    if-then-else

    Ruby

    if a = b
      "equal!"
    else
      "not equal!"
    end

    Scala

    if (a == b) {
      "equal!"
    }
    else {
      "not equal!"
    }

    Scalaでもifは式であり、値を返すことができる。 後置式はない。

    unless

    Ruby

    unless foo?
      "not foo"
    else
      "foo"
    end

    Scala

    if (!isFoo)
      "not foo"
    else
      "foo"

    Scalaにunlessはない。

    case

    Ruby

    case hoge
    when 1
      "one"
    when 2, 3
      "two or three"
    end

    Scala

    hoge match {
      case 1 =>
        "foo"
      case 2|3 =>
        "two or three"
    }

    Rubyのcase式もScalaのmatch式もどちらも強力だがここでは最も基本的な形を挙げている。

    繰り返し

    whileループ

    Ruby

    while true
      puts("Hello")
    end

    Scala

    while (true) {
      println("Hello")
    }

    untilループ

    Ruby

    until f.eof?
      print f.gets
    end

    Scala

    while (!f.isEof) {
      println(f.getLine)
    }

    untilはない。

    forループ

    Ruby

    for i in [1,2,3]
      print i * 2, "\n"
    end

    Scala

    for (i <- Seq(1,2,3)) {
      println(i * 2)
    }

    Scalaのfor式はもっと多機能だがここでは基本的な形を挙げている。

    break

    Ruby

    i = 0
    while true
      puts i
      i += 1
      if i > 10
        break
      end
    end

    Scala

    import scala.util.control.Breaks
    val breaks = new Breaks
    var i = 0
    breaks.breakable {
     while (true) {
       println(i)
       i += 1
       if (i > 10) breaks.break()
     }
    }

    ループのブレイクが構文として用意されていないので、標準ライブラリの Breaks を使う必要がある。

    next, redo, retry

    Ruby

    lines.each do |line|
      next if line.blank?
      puts line
    end

    Scala

    lines.foreach { line =>
      if (!line.isEmpty) {
        println(line)
      }
    }

    next, redo, retryなどの構文はないのでifなどを使って実装する必要がある。

    例外処理

    例外の送出

    Ruby

    raise StandardError.new("例外が起きました")

    Scala

    throw new RuntimeException("例外が起きました")

    例外の捕捉

    Ruby

    begin
      do_something
    rescue ZeroDivisionError => e
      recover(e)
    ensure
      must_to_do
    end

    Scala

    try {
      doSomething
    }
    catch {
      case e: ArithmeticException =>
        recover(e)
    }
    finally {
      mustToDo
    }

    return

    Ruby

    return 1

    Scala

    return 1

    returnはほぼ同じ。 関数やメソッド、ブロックの最後のretrunを省略すると、Rubyと同じように最後に評価された値を返す。

    ※読みやすいレイアウトでまとめましたサイトを作りましたので、こちらもご参照ください。
    http://kkismd.github.io/rb2scala/