Blogフリュー株式会社の技術ブログです2014年01月17日Scala-return文を色々に呼び出してみたScalaあけましておめでとうございます。今年もよろしくお願いいたします。「逆変換してもまだ本物よりイケメン」とか散々言われまくってます。今日は画像なしで、Scalaのreturn文の挙動について文章だけで勝負します。皆様、リーダブルコードという本はご存知でしょうか。タイトルそのまま、読みやすいソースコードを書くためのテクニックが書かれた本です。非常に読みやすく、しかもエッセンスを抽出してコンパクトにまとめられた良書です。この本の中で、return文に関するTipsとして「関数からはやく返す」という項目があります。「Scalaっぽくない」という話になって、確かにその通りなのでコード自体はreturn文を使わないように変更しました。ここから処理が続く}この時ふと、「Scalaって引数に関数を渡せるけど、じゃあreturn文を書いた時に、どの関数の結果になるんだ」という話になっていろいろ試すことになりました。いうわけで、ScalaのREPLで色々なreturn文を試してみました。ケース1とりあえず、裸のreturnを書いてみました。3</code>はい、当然のように3を返す関数が出来ました。関数型言語らしく高階関数の中でreturn文を呼び出してみたらどうなるか実験します。Int型を返す関数を引数にとる関数barを定義します。関数barは、第1引数boolがtrueであれば、第2引数のblock関数を実行した結果に+1して返します。2</code>試しに呼び出すと、引数を1を返す関数として認識して、+1して処理してくれてます。結果は2になりますね。この関数引数にreturn文を書いてみます。1)^</code>あれ?また関数定義の外でreturnしちゃだめって怒られました。ぬぬぬ、barは関数を引数に取ることを明記してるけど、どうやらダメらしい。1</code>関数bazzの戻り値が1になっとるッッ結局、高階関数の引数にreturnを書いても、そのreturn文がどのメソッド定義の中に書かれているかが重要なようです。エラーメッセージ通りってことですね。4</code>お!4が帰ってきた!ここまでのまとめ高階関数でもベタにreturn文を書くことはできない→明示的な関数定義が必要return文が扱う制御は、return文が書かれた箇所で明示的に定義されている関数ただし、return文の処理タイミングは高階関数で制御できる総括というわけで、Scalaのreturnは明示的に宣言された関数の制御文として動作することがわかりました。高階関数と組み合わせて使いはじめると、一体どのタイミングでreturn文が実行されるのか、ワケガワカラナイヨなので、わざわざ使わないほうが良さそうです。実際にreturn禁止のスタイルガイドもあるみたいです。いうか、Scalaの作者がそう言ってるみたいです。conventions?関数内の見通しが悪くなるからreturnで処理を中断したいと思うような場合は、メソッド分割などを駆使して、そもそも関数が長くなりすぎたり、インデントが深くなり過ぎないようにしましょう。