ホーム 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/

記事を共有

最近人気な記事