こんにちは! フリーエンジニアの長瀬です。
みなさんはrubyライフを楽しんでいますか?defはメソッドを定義するためのものなのですが、初心者の方はどうしてもつまづいてしまうポイントでもあります。
この記事では、rubyのdefでのメソッドの定義について
- defってどうやって使うの?
- selfって何?
- returnってないの?
という基本的な内容から、
- メソッドに引数を設定しよう
- defined?でメソッドが定義されているか確認する
- aliasでメソッドに別名を付ける
- yieldを使ってブロックを実行する
- define_methodを使って動的にメソッドを定義する
といった応用的な内容についても解説していきます。
defを使ってメソッドを定義する
defってどうやって使うの?
それではまずdefの使い方を見ていきましょう。defは「メソッドを定義するためのもの」です。プログラミングは模型を組み立てる作業によく例えられます。
小さい模型なら一つのパーツで組み立てられますが、大きい模型になると、パーツをどんどん増やしていく必要があります。試しにひとつdefを使ってメソッドを定義してみましょう。
def dog p "wan" end dog
[実行結果]
"wan"
今回は、dogという名前の、“wan”という文字を標準出力するメソッドを定義しました。メソッドの定義はプログラミングの基本なので、しっかり覚えておくようにしましょう!
selfって何?
defの中によく「self」という文字が出てくることがあります。このselfには二つの意味があります。
レシーバとしてのself
ひとつ目はレシーバとしてのselfです。def内でselfと打つと、そのメソッドのレシーバを表すことができます。
class Animal def kind p self end end animal = Animal.new animal.kind
[実行結果]
#
このようにレシーバであるAnimalが返ってきていることがわかります。
※レシーバの結果は上記出力結果と同じ値で表示されるわけではありません。
また、rubyでクラスを扱う方法が曖昧な方はこちらの記事をまず一読することをおすすめします。
クラスメソッドとしてのself
二つ目はクラスメソッドとしてのselfです。
class Animal def self.dog p "wan" end end p Animal.dog
[実行結果]
"wan"
このようにクラスから呼び出されるメソッドをクラスメソッドといいます。詳しくは下の記事をごらんください!
returnってないの?
他の言語では関数の返り値はreturnメソッドで設定されることが多いと思います。しかしRubyではこのreturnを省略することができ、メソッド内で最後に実行された値が自動的に入るという設計になっています。
def dog "wan" end p dog
[実行結果]
"wan"
明示的にreturnで返り値を設定することもできます。
def dog return "bow" "wan" end p dog
[実行結果]
"bow"
ただこのように明示的にreturnを返すことは特殊なケースを除いてないので、基本的には最後に処理された値が返ると覚えておくようにしましょう!
メソッドの扱い方応用編
メソッドに引数を設定しよう
defを使って、メソッドを定義する際には引数を設定できます。def メソッド名(引数)という形式で定義できます。
def hoge(name) p name end hoge("banana") hoge("strawberry")
[実行結果]
"banana" "strawberry"
また、文字列中で受け取った変数を使いたい場合は#{}の中にその変数を入れます。
def hoge(name) p "この果物は#{name}です" end hoge("banana") hoge("strawberry")
[実行結果]
"この果物はbananaです" "この果物はstrawberryです"
これをプログラミング用語では「変数展開」といいます。rubyでは様々な引数の設定の方法があります。こちらの記事で詳しく説明してありますので、一読することをおすすめします。
defined?でメソッドが定義されているか確認する
rubyにはメソッドや変数が定義されているかを確認するメソッドとしてdefined?メソッドがあります。このメソッドを使えば、そのメソッド名や変数が使用されているのか確認できます。
def foo p "This is the hogest thing on Earth" end a = "Bob" p defined?(foo) p defined?(a) p defined?(z)
[実行結果]
"method" "local-variable" nil
このように、defined?メソッドはローカル変数なら”local-variable”、メソッドなら”method”を返し、そして定義されていないならnilを返します。
aliasでメソッドに別名を付ける
rubyではaliasというメソッドを使えうとすでに定義されているメソッドに別名を付けることができます。
def hoge p "This is an ant." end hoge alias ant hoge #hogeに別名antを与える ant
[実行結果]
"This is an ant." "This is an ant."
このようにantという別名を与えることで、hogeメソッドをantでも呼び出すことができました。メソッド名の候補が複数ある場合、aliasメソッドを使って別名をつけてみるのもいいかもしれません。
yieldを使ってブロックを実行する
rubyでは実はすべてのメソッドがブロックをデフォルトで引数として受けとることができます。ブロックとは処理のかたまりで、わざわざメソッドを定義しなくても使える名前のないメソッドのようなものです。
ブロックが使えるようになるとrubyでの処理の書き方の幅が格段に広がります。そもそもブロックってなに??LEGOブロックのこと?と思った方はまずこちらの記事を一読することをおすすめします。
それではメソッドにブロックを渡してみましょう。メソッドに渡されたブロックはyieldメソッドを使って展開できます。
def hoge yield end proc = Proc.new{p "I'm gonna give you this treasure."} hoge(&proc)
[実行結果]
"I'm gonna give you this treasure."
とくにブロック引数を受け取ることを設定していないのに、hogeメソッドにブロックを渡せています。ブロックはそれ単体ではオブジェクトとして存在することができないので、Procオブジェクトの力を借りる必要があります。
Procやyieldに関してはこちらにまとめてあるので、一読されることをおすすめします。
define_methodを使って動的にメソッドを定義する
define_methodというメソッドを使うと、メソッドをメソッドで動的に定義できます。言葉ではわかりにくいので、サンプルコードで確認していきましょう。
class Fruit hash = {ruby:"Rails",php:"CakePHP",swift:"perfect"} hash.each do |k,v| define_method(k){p v} end end Fruit.new.ruby Fruit.new.php Fruit.new.swift
[実行結果]
"Rails" "CakePHP" "perfect"
このようにFruitというクラスには一見、defで定義されたメソッドが存在しません。
しかし、実はdefine_methodによって定義されたハッシュのkeyとvalueを使ってruby、php、swiftというインスタンスメソッドが作成されているのです。このメソッドはdefine_method(メソッド名){メソッドの処理}という形式で使用します。
今回の場合はkeyであるrubyがメソッドの名前になって、valueである”Rails”がメソッドの中身として出力されています。また、ハッシュのeachについてはこちらにまとめてありますので、一読することをおすすめします。
Rubyを独学で頑張っているけど先が見えない方のために
そんな方、実はいらっしゃるのではないでしょうか?
そんな方であれば、これから先の話は必要ないでしょう。そっとページの閉じるボタンを押しましょう。
しかし、「先が見えない」と心の底では勘付いているそこの奥さん。この先を読み進めて、一緒に課題を深堀りしていきましょう。
なぜ「先が見えない」という不安や悩みを抱えてしまうのか
さて、「一寸先は闇だ・・・」とお悩みを抱えている方に、なぜ独学でRubyを勉強しているにもかかわらず、そのような現状を抱えてしまうのか、一緒に考えていきましょう。
先が見えない現状を踏まえ、課題として考えられるものは以下のどれかに該当するでしょう。
- プログラミングの上達が見えない
- プログラミングを継続できない気がする
- プログラミングスキルを習得した姿がイメージできない
- プログラミングスキルを活かした仕事を獲得するイメージができない
これらのどれかに該当することによって、「なんとなくプログラミング学習をしている」という状態になってしまいます。
これらの要因は、三日坊主になる理論と同じなんですが、「プログラミング学習をしなきゃ」とプログラミング学習を頑張ってしまっている状態になってしまっています。
受験勉強をやった経験のある方なら頭がもげるほどに首を縦に振ってしまう方も多いのですが、「今日も5時間勉強するぞ」や「今日はこの章を終わらすぞ」というように、学習を進めることに意識が行き過ぎてしまうと、ある程度学習を継続した後に「先が見えない・・・」となってしまいます。
未来に光を当て、プログラミング学習を「成果が出るもの」にするために
先ほど、「なぜ先が見えないという悩みや不安を抱えてしまうのか」という疑問に対しての答えを示していきました。
これらの課題というのは、独学をしていれば9割の方がぶつかってしまう壁だそうで、いわば、あるあるの現象なのです。
独学をしていて、「なんか前に進めていないぞ」と感じるのはこのせいなんですね。甘く見がちですが、非常にやっかい。
これがさらにやっかいさを極めているのは、上記に挙げた課題のほとんどが、1人で解決できないものばかりだからです。
実は、これらのほとんどが経験者に助けてもらいながら解決しないと、すぐに違う方向へと流れてしまいます。
そう言い切れるのは、以前の私もそうだったからです。
エンジニアやプログラマー関連のキャリアに詳しい方や現役のエンジニアに相談しながら修正を加え、学習を実践して今があります。
という方もいるでしょう。そういう時にこそ、プログラミングスクールの無料カウンセリングを利用するのです。
という考えに辿りついてしまいますよね。結論から言うと弊社では、そういった強引な営業等を行うことはありませんので、安心して受講できます。
「プログラミング学習の先ある未来」を光で明るく照らすには、弊社の無料カウンセリングがぴったりだと断言できます。それくらい無料カウンセリングに自信を持っているのです。
さらに、無料カウンセリングには以下の3大特典もついてきます!
- 「最短1ヶ月で開発ができる学習方法」電子書籍(非売品)
- 効率的なオリジナル学習カリキュラム
- 未経験の転職(フリーランス)を可能にするキャリアサポート
上記の特典だけでも他のスクールにはないポイントだと自信を持っている無料カウンセリング特典です。
ただプログラミング学習をする毎日から、ワクワクしながらプログラミング学習できる毎日に変える体験を一度でいいのでしてみませんか?
まとめ
いかがでしたでしょうか?この記事では、defでのメソッドの定義を解説しました。
まず基本的な内容では
- defを使って基本的なメソッドの定義方法
- selfの使い方
- returnの扱い方
を説明し、応用編では
- 引数を設定する方法
- defined?メソッドで、メソッドが定義されているか確認する方法
- aliasメソッドで別名を付ける方法
- yieldでブロックをメソッドに渡す方法
- define_methodで動的にメソッドを定義する方法
を解説しました。
メソッドの定義にはさまざまなパリエーションがあって楽しいですね。ぜひこの記事をなんども読んでメソッドの扱い方をマスターしてください。もしdefでのメソッドの定義について忘れてしまったらこの記事を確認してくださいね!