Rubyの制御構造は、他の多くの言語と似ていますが、Rubyの「すべてが式である」という哲学と、読みやすさを重視した構文(unlessなど)に特徴があります。また、メソッド(関数)の定義は非常に柔軟で、強力な引数の扱いや例外処理の仕組みを備えています。
Rubyの条件分岐は、if、unless、caseが基本です。ifやcaseは文(Statement)ではなく**式(Expression)**であるため、それ自体が値を返します。
基本的な構文は他言語と同様ですが、else ifは elsif(eが1つ)と綴る点に注意してください。
ifは値を返すため、結果を変数に代入できます。
unlessは if !(もし~でなければ)の糖衣構文(Syntactic Sugar)です。条件が偽 (false) の場合にブロックが実行されます。
補足:
unlessにelseを付けることも可能ですが、多くの場合ifを使った方が可読性が高くなります。
C言語やJavaの switch 文に似ていますが、より強力です。when 節では、複数の値、範囲(Range)、正規表現、さらにはクラスを指定することもできます。break は不要です。
ruby case_example.rbRubyでは、後の章で学ぶイテレータ(eachなど)が繰り返し処理の主流ですが、C言語スタイルの while や until も利用可能です。
条件が真 (true) の間、ループを続けます。
while ! と同じです。条件が偽 (false) の間、ループを続けます。
Rubyでは、def キーワードを使ってメソッドを定義します。
Rubyのメソッドは、最後に評価された式の結果を暗黙的に返します。return キーワードは、メソッドの途中で明示的に値を返したい場合(早期リターン)に使いますが、必須ではありません。
ruby method_return.rbRubyは、デフォルト引数、キーワード引数、可変長引数など、柔軟な引数の定義をサポートしています。
引数にデフォルト値を設定できます。
Pythonのように、引数名を指定して値を渡すことができます。:(コロン)を末尾に付けます。キーワード引数は可読性を大幅に向上させます。
ruby keyword_arguments.rb引数の先頭に *(Splat演算子)を付けると、任意の数の引数を配列として受け取ることができます。
JavaやPythonの try-catch-finally に相当する構文として、Rubyは begin-rescue-ensure を提供します。
begin: 例外が発生する可能性のある処理を囲みます。
rescue: 例外を捕捉(catch)します。捕捉する例外クラスを指定できます。else: (Optional) begin ブロックで例外が発生しなかった場合に実行されます。ensure: (Optional) 例外の有無にかかわらず、最後に必ず実行されます(finally)。ruby exception_example.rb補足:
def...endのメソッド定義内では、beginとendは省略可能です。
raise を使って、意図的に例外を発生(throw)させることができます。
if, case)は式であり、値を返します。
if ! の代わりに unless を、while ! の代わりに until を使うことで、否定条件を読みやすく記述できます。return を使わずとも最後に評価された式が自動的に返されます。name:), 可変長引数 (*args) を駆使することで、非常に柔軟に定義できます。begin, rescue (catch), ensure (finally) で行い、raise で意図的に例外を発生させます。生徒の点数(0〜100)を受け取り、以下の基準で評価(文字列)を返すメソッド evaluate_score(score) を作成してください。
ArgumentError を raise してください。case 文と raise を使用して実装してください。
ruby practice3_1.rbログメッセージ(必須)と、オプションとしてログレベル(キーワード引数 level:)およびタグ(可変長引数 tags)を受け取るメソッド logger を作成してください。
def logger(message, level: "INFO", *tags)logger("Server started")
[INFO] Server startedlogger("User login failed", level: "WARN", "security", "auth")
[WARN] (security, auth) User login failedlogger("DB connection lost", level: "ERROR", "database")
[ERROR] (database) DB connection lost(ヒント: タグの配列 tags が空でないかを確認し、join メソッドを使って整形してください。)
ruby practice3_2.rb