Rubyのメソッド入門:defキーワードで独自のメソッドを定義する方法
Rubyにおける「メソッド」とは、特定の目的のためにひとまとめにされた、1行以上のRubyコードのことです。
このコードのまとまりには名前が付けられており、一度定義してしまえば、同じコードを何度も書いたりコピー&ペーストしたりすることなく、必要なときにいつでも再利用できます。
メソッドの主な役割
メソッドの目的は、大きく分けて以下のようなものがあります。
- 情報を取得する
- オブジェクトを変更・生成する
- データをフィルタリング・整形する
具体例
例1:
Arrayオブジェクトに対するsizeメソッドは、配列内の要素数を返します(情報の取得)。
例2:
popメソッドは、配列から最後の要素を取り除きます(オブジェクトの変更)。
オブジェクト・クラス・メソッドの関係が理解できると、Rubyの仕組み全体がぐっと見えやすくなります。それでは、学習を進めていきましょう!
メソッドの定義方法
Rubyには強力な組み込みメソッドが数多く用意されていますが、自分で新しいメソッドを作ることもできます。
その方法は?
defキーワードを使えば、独自のインスタンスメソッドを定義できます。
基本の構文はこちらです:
def gimme_bacon puts "Bacon plz." end
それぞれの要素の意味を見ていきましょう:
def… Rubyの構文の一部で、「メソッドを定義します」という宣言を表しますgimme_bacon… メソッドの名前ですputs "Bacon plz."… メソッドの本体(実際に実行される処理)ですend… メソッド定義の終わりを示します
ただし、メソッドを定義しただけでは、Rubyに「こういうメソッドを作りたい」と伝えたことにすぎません。
実際に使うためには、メソッドを呼び出す必要があります。
Rubyでのメソッドの呼び出し方
Rubyでは、メソッドを使うことを「メソッドを呼び出す(call)」と表現します。
「メソッドコール」という言葉をよく耳にしますし、オブジェクト指向に厳格な開発者と一緒に作業している場合は、「メッセージを送っている」という言い方を聞くこともあるでしょう。
どちらの表現であっても、基本的な考え方は同じです。それでは、実際にメソッドを使ってみましょう。
実行例:
gimme_bacon
この結果、次のように出力されます:
"Bacon plz."
また、メソッドはオブジェクトに対して呼び出すこともできます。
例を見てみましょう:
n = [1,2,3] n.size # 3
このn.sizeは、Arrayであるオブジェクトnに対して、sizeメソッドを呼び出しています。
結果はどうなるでしょうか?
配列のサイズ(要素数)が取得できます。
どんなメソッドが使えるのか?
これは、メソッドを呼び出す対象となるオブジェクトのクラスによって異なります。
配列には、ハッシュとは異なるメソッドが用意されています。
各クラスで利用できるメソッドの一覧は、Rubyの公式ドキュメントで確認できます。
メソッドから値を返す方法
Rubyの重要な概念のひとつとして、「すべてのメソッドは必ず値を返す」という点が挙げられます。
詳しく説明しましょう。
メソッドを呼び出すと、必ず何らかの結果が返ってきます。
この「返ってくるもの」は、メソッド定義内の最後の式の評価結果です。
具体的に見てみましょう:
def number_one 1 end number_one # 1
もうひとつ例を挙げます:
def add(x,y) x + y end add(5, 6) # 11
これを「暗黙の戻り値(implicit return)」と呼びます。「最後の式の結果が自動的に返される」という仕組みに、ちょっとかっこいい名前が付いただけのものです。
さらに:
returnキーワードを使って、明示的に値を返すこともできます。
def two return 2 end # 2
ここで注意したいのは、returnを実行した時点でメソッドの処理が終了するという点です。
この性質を利用すると、条件によって途中で処理を抜ける「早期リターン」や、ループからの脱出などを実装できます。
メソッド名に「?」や「!」が付いているのはなぜ?
Rubyのコードを読んでいると、少し変わった名前のメソッドに出会うことがあります。
たとえば、こんな名前です:
empty?sort!title=
これらはすべて有効なメソッド名です。
では、疑問符(?)、感嘆符(!)、イコール記号(=)には、それぞれどのような意味があるのでしょうか?
これらはRubyコミュニティで広く共有されている命名規則(慣習)です。
それぞれの意味を解説します:
- 疑問符(?)付きのメソッド:「述語メソッド」とも呼ばれ、
trueかfalseを返すことが期待されます - 感嘆符(!)付きのメソッド:感嘆符なしのバージョンとは異なる動作をすることを示します。多くの場合、レシーバ自身を破壊的に変更する(要素の追加・削除など)ことを意味します。「バンメソッド(bang methods)」とも呼ばれます
- イコール記号(=)付きのメソッド:代入を意味します。インスタンス変数に値を設定するために使われます
これらの慣習は言語によって強制されるものではありません。
しかし…
この慣習に従うことで、より「Rubyらしい」自然なコードを書けるようになります!
まとめ
この記事では、Rubyのメソッドの強力さについて学び、メソッドの定義方法、呼び出し方、そして適切な命名規則への従い方を理解しました。
今度はあなたが実際にコードを書いて、この知識を実践してみる番です 🙂
最後までお読みいただき、ありがとうございました!
-
Rubyプログラムのデバッグと修正方法を徹底解説|スタックトレースの読み方からPry・Byebugまで
書いたプログラムが、初回実行で思い通りに動くことってどれくらいありますか? 多くの場合、プログラムは期待どおりには動いてくれないもの。そんなときに頼りになるのがRubyのデバッグという技術です。原因を突き止めるための頼れる相棒といえるでしょう。 次のようなエラーメッセージを見たことはありませんか? undefined method some_method for nil:NilClass これは、nil値がコードの中に紛れ込んでしまったことを意味します。 本記事で紹介するテクニックを身につければ、この問題や似たようなトラブルにも自信を持って対処できるようになりますよ! エラーとスタックトレース
-
Rubyで学ぶ!シーザー暗号エンコーダーの自作方法
シーザー暗号(Caesar cipher)をご存知ですか? これは、ユリウス・カエサルが敵に知られないよう秘密のメッセージを隠すために実際に使った暗号化手法です。 シーザー暗号は、最も原始的な暗号技術の一つとされています。 その仕組みの核心は、アルファベットの文字をx個分だけずらす(ローテートする)というシンプルなアイデアにあります。 例えば x = 1 の場合、「A」は「B」に、「C」は「D」に変換されます。以下同様です。 では、これをコードで実装するにはどうすればよいのでしょうか? 答えは意外と簡単です。文字は数値(ASCIIコード)として表現できるという事実を利用すれば、文字の回転処理