【Ruby】メソッドの書き方と使い方の基本
開発環境
- Ruby version: ruby 3.1.2
Rubyのメソッドとは
Rubyのメソッドとは、特定のオブジェクトに対して実行されるアクションや操作を定義するために使用されます。 メソッドを定義することにより、共通した処理をひとつにまとめることができ、メソッドを呼び出すことによって何度も再利用(実行)できるようにして扱いやすくしたコードの塊です。 また、Rubyのメソッドは標準で組み込まれているメソッド(関数)ではなく、ユーザーが独自に定義できる関数のことをメソッドと呼びますが、どこからでも呼べるのでほかの言語の「関数」とほぼ同じ意味として使われます。 公式リファレンス:https://docs.ruby-lang.org/ja/latest/class/Method.html
Rubyのメソッドの書き方
Rubyのメソッドの書き方をご紹介します。
1# メソッド定義 2def メソッド名(引数1, 引数2, ...) 3 実行する処理 4 return 戻り値 5end 6 7# メソッド実行 8メソッド名
Rubyのメソッドは「def」と「end」の間に実行したい処理を入れます。 また、メソッドが戻り値を返す場合、通常はメソッド本体内で「return」を使用して指定しますが、Rubyの場合は明示的な「return」を使わなくても、メソッド内の最後に評価された式が自動的に戻り値として返されます。 そのため、以下のように記述することができます。
1# メソッド定義 2def メソッド名(引数1, 引数2, ...) 3 実行する処理 4end 5 6# メソッド実行 7メソッド名
一般的には上記の書き方が使われています。
Rubyのメソッドの命名規則
Rubyのメソッドの命名規則にはいくつかルールがあります。
- 1文字目は英文字かアンダースコア(_)
- 2文字目以降は英数文字、アンダーバー
メソッド名は大文字の英文字で開始することも可能ですが、クラス定義などをする場合はキャメルケースで記述されることが一般的なため、クラスとメソッドの命名を区別するためにメソッド名を大文字で開始するのはおすすめできません。
Rubyのメソッドの定義場所
Rubyのメソッドの定義場所にはルールがあります。 Rubyに限ったことではありませんが、プログラムは上から順番に読み込まれて実行されるため、メソッドを呼び出す「前」にメソッドを定義しなければエラーになります。
1greeting 2 3def greeting 4 puts("こんにちは") 5end 6# => undefined local variable or method `greeting' for main:Object (NameError)
そのため、メソッドを定義する場所とメソッドの呼び出し位置には気をつけましょう。
Rubyのメソッドの使い方
Rubyのメソッドのよくあるパターンをサンプルコードを用いて使い方の解説をしていきます。
Rubyのメソッドに引数を使用しないパターン
Rubyのメソッドに引数を使用しないパターンです。
1def greeting 2 puts("こんにちは") 3end 4 5greeting 6# => こんにちは
Rubyのメソッドで引数を使用しない場合は、上記のように括弧を省略することができます。
Rubyのメソッドに引数を使用するパターン
Rubyのメソッドに引数を使用するパターンです。
1def greeting(name) 2 puts("#{name}さん、こんにちは") 3end 4 5greeting("山田") 6# => 山田さん、こんにちは
上記はメソッドを呼び出す際に引数1に値を渡し、メソッドが呼び出されたときに引数1で山田を受け取り、メソッドで定義されたnameに山田が代入されたという流れになります。 また、下記の書き方ではエラー出ます。
1def greeting(name) 2 puts("#{name}さん、こんにちは") 3end 4 5name = "山田" 6 7greeting 8# =>wrong number of arguments (given 0, expected 1) (ArgumentError)
変数の有効範囲(スコープ)が決まっています。 メソッドの変数の有効範囲(スコープ)は、メソッド内で定義されている変数のみになるため、メソッド外で定義した変数をメソッド内で使うと未定義のエラーが発生します。
Rubyのメソッドに複数の引数を使用するパターン
Rubyのメソッドに複数の引数を使用するパターンです。
1def greeting(name, greeting) 2 puts("#{name}さん、#{greeting}") 3end 4 5greeting("山田", "おはようございます") 6# =>山田さん、おはようございます
メソッドに複数の引数が定義する場合は、引数名をカンマ(,)で区切って続けて記述します。 また、メソッドの呼び出し側でも値をを渡す際はカンマ(,)で区切って続けて記述することで定義された引数に値を渡すことができます。
Rubyのメソッドで引数にデフォルト値を設定するパターン
Rubyのメソッドで引数にデフォルト値を設定するパターンです。
1def greeting(name = "ゲスト") 2 puts("#{name}さん、こんにちは") 3end 4 5greeting 6# =>ゲストさん、こんにちは
メソッドの引数nameに対してデフォルト値を代入しています。 そのため、メソッドを呼び出したときに引数に値を渡さなかった場合は、メソッド側で定義された値が代入されるため、「name」には「ゲスト」が代入されています。 メソッドの引数にデフォルト値が設定されている場合でも、メソッドを呼び出すときに値を渡すこともできます。
1def greeting(name = "ゲスト") 2 puts("#{name}さん、こんにちは") 3end 4 5greeting("山田") 6# =>山田さん、こんにちは
上記ではメソッド引数1に対して山田が渡されているため、「name」には「山田」が代入されています。 注意点としては、メソッドを呼び出す側の値は順番にメソッドで定義した引数に渡されるため、引数の順番を間違えると、予期しない結果が起きてしまいます。
Rubyのメソッドで引数にキーワード引数を設定するパターン
Rubyのメソッドで引数にキーワード引数を設定するパターンです。
1def greeting(name:, greeting:) 2 puts("#{name}さん、#{greeting}") 3end 4 5greeting(greeting: "おはようございます", name: "山田") 6# =>山田さん、おはようございます
Ruby2.0以降ではキーワード引数を定義することができるため、引数の順番が前後したとしてもメソッドの呼び出し側で指定した引数に値を渡すことができます。 ただし、キーワード引数を使用している場合は、メソッドの呼び出し側でもキーワードに対して値を渡さなければエラーとなります。
また、下記のようにキーワード引数に対してもデフォルト値を定義することができます。
1def greeting(name: "ゲスト", greeting: "こんにちは") 2 puts("#{name}さん、#{greeting}") 3end 4 5greeting 6# =>ゲストさん、こんにちは
メソッドに引数を定義する場合は、どのような仕様にするかを検討して設計するといいでしょう。
おわりに
Rubyのメソッドの使い方を解説してきました。
メソッドは同じ処理を実行する場合に、何度も同じコードを書かずに済むだけでなく修正箇所がある場合に、メソッド内のコードだけ修正すれば良くなります。
また、メソッドをどの粒度で定義するかによってもシステム拡張性や保守性に深く関わってくるため、しっかりとメソッドを使いこなしていきましょう。