my.code();

my.code();

  • Python
    • 1.環境構築と基本思想
    • 2.基本構文とデータ型
    • 3.リスト、タプル、辞書、セット
    • 4.制御構文と関数
    • 5.モジュールとパッケージ
    • 6.オブジェクト指向プログラミング
    • 7.ファイルの入出力とコンテキストマネージャ
    • 8.例外処理
    • 9.ジェネレータとデコレータ
  • Ruby
    • 1.rubyの世界へようこそ
    • 2.基本構文とデータ型
    • 3.制御構造とメソッド定義
    • 4.すべてがオブジェクト
    • 5.コレクション (Array, Hash, Range)
    • 6.ブロックとイテレータ
    • 7.クラスとオブジェクト
    • 8.モジュールとMix-in
    • 9.Proc, Lambda, クロージャ
    • 10.標準ライブラリの活用
    • 11.テスト文化入門
    • 12.メタプログラミング入門
  • C++
    • 1.C++の世界へようこそ
    • 2.型システムとメモリ
    • 3.関数と参照
    • 4.ポインタと動的メモリ
    • 5.クラスの基礎
    • 6.クラスを使いこなす
    • 7.継承とポリモーフィズム
    • 8.テンプレート
    • 9.STL ①:コンテナ
    • 10.STL ②:アルゴリズムとラムダ式
    • 11.RAIIとスマートポインタ
    • 12.プロジェクトの分割とビルド

第3章: 制御構造とメソッド定義

Rubyの制御構造は、他の多くの言語と似ていますが、Rubyの「すべてが式である」という哲学と、読みやすさを重視した構文(unlessなど)に特徴があります。また、メソッド(関数)の定義は非常に柔軟で、強力な引数の扱いや例外処理の仕組みを備えています。

条件分岐

Rubyの条件分岐は、if、unless、caseが基本です。ifやcaseは文(Statement)ではなく**式(Expression)**であるため、それ自体が値を返します。

if, else, elsif

基本的な構文は他言語と同様ですが、else ifは elsif(eが1つ)と綴る点に注意してください。

ifは値を返すため、結果を変数に代入できます。

unless

unlessは if !(もし~でなければ)の糖衣構文(Syntactic Sugar)です。条件が偽 (false) の場合にブロックが実行されます。

補足: unless に else を付けることも可能ですが、多くの場合 if を使った方が可読性が高くなります。

case

C言語やJavaの switch 文に似ていますが、より強力です。when 節では、複数の値、範囲(Range)、正規表現、さらにはクラスを指定することもできます。break は不要です。

case_example.rb
ruby case_example.rb

繰り返し処理

Rubyでは、後の章で学ぶイテレータ(eachなど)が繰り返し処理の主流ですが、C言語スタイルの while や until も利用可能です。

while

条件が真 (true) の間、ループを続けます。

until

while ! と同じです。条件が偽 (false) の間、ループを続けます。

メソッドの定義 (def)

Rubyでは、def キーワードを使ってメソッドを定義します。

基本的な定義と戻り値(returnの省略)

Rubyのメソッドは、最後に評価された式の結果を暗黙的に返します。return キーワードは、メソッドの途中で明示的に値を返したい場合(早期リターン)に使いますが、必須ではありません。

method_return.rb
ruby method_return.rb

引数の種類

Rubyは、デフォルト引数、キーワード引数、可変長引数など、柔軟な引数の定義をサポートしています。

デフォルト引数

引数にデフォルト値を設定できます。

キーワード引数

Pythonのように、引数名を指定して値を渡すことができます。:(コロン)を末尾に付けます。キーワード引数は可読性を大幅に向上させます。

keyword_arguments.rb
ruby keyword_arguments.rb

可変長引数 (Splat演算子)

引数の先頭に *(Splat演算子)を付けると、任意の数の引数を配列として受け取ることができます。

例外処理

JavaやPythonの try-catch-finally に相当する構文として、Rubyは begin-rescue-ensure を提供します。

begin, rescue, ensure

  • begin: 例外が発生する可能性のある処理を囲みます。
    • rescue: 例外を捕捉(catch)します。捕捉する例外クラスを指定できます。
    • else: (Optional) begin ブロックで例外が発生しなかった場合に実行されます。
    • ensure: (Optional) 例外の有無にかかわらず、最後に必ず実行されます(finally)。
exception_example.rb
ruby exception_example.rb

補足: def ... end のメソッド定義内では、begin と end は省略可能です。

raise (例外の発生)

raise を使って、意図的に例外を発生(throw)させることができます。

この章のまとめ

  • Rubyの制御構造(if, case)は式であり、値を返します。
    • if ! の代わりに unless を、while ! の代わりに until を使うことで、否定条件を読みやすく記述できます。
    • メソッドの戻り値は、return を使わずとも最後に評価された式が自動的に返されます。
    • メソッドの引数は、デフォルト引数、キーワード引数 (name:), 可変長引数 (*args) を駆使することで、非常に柔軟に定義できます。
    • 例外処理は begin, rescue (catch), ensure (finally) で行い、raise で意図的に例外を発生させます。

練習問題1: 評価メソッドの作成

生徒の点数(0〜100)を受け取り、以下の基準で評価(文字列)を返すメソッド evaluate_score(score) を作成してください。

  • 90点以上: "A"
  • 70点〜89点: "B"
  • 50点〜69点: "C"
  • 50点未満: "D"
  • 0未満または100を超える場合: ArgumentError を raise してください。

case 文と raise を使用して実装してください。

practice3_1.rb
ruby practice3_1.rb

練習問題2: 柔軟なログ出力メソッド

ログメッセージ(必須)と、オプションとしてログレベル(キーワード引数 level:)およびタグ(可変長引数 tags)を受け取るメソッド logger を作成してください。

  • メソッドシグネチャ: def logger(message, level: "INFO", *tags)
  • 実行例:
    • logger("Server started")
      • 出力: [INFO] Server started
    • logger("User login failed", level: "WARN", "security", "auth")
      • 出力: [WARN] (security, auth) User login failed
    • logger("DB connection lost", level: "ERROR", "database")
      • 出力: [ERROR] (database) DB connection lost

(ヒント: タグの配列 tags が空でないかを確認し、join メソッドを使って整形してください。)

practice3_2.rb
ruby practice3_2.rb