この記事はアピリッツの技術ブログ「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/