【Ruby入門】defについてまとめてみました(return,self,defined)

こんにちは! フリーエンジニアの長瀬です。

みなさんは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に関してはこちらにまとめてあるので、一読されることをおすすめします。


【Ruby入門】yieldの使い方まとめ
更新日:2024年5月6日

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を頑張っているわけだけど、先が見えない・・・

そんな方、実はいらっしゃるのではないでしょうか?

いや、おれは違うぞ。先のキャリアもしっかり見えてるし、独学の成果も出てきている

そんな方であれば、これから先の話は必要ないでしょう。そっとページの閉じるボタンを押しましょう。

しかし、「先が見えない」と心の底では勘付いているそこの奥さん。この先を読み進めて、一緒に課題を深堀りしていきましょう。

なぜ「先が見えない」という不安や悩みを抱えてしまうのか

さて、「一寸先は闇だ・・・」とお悩みを抱えている方に、なぜ独学でRubyを勉強しているにもかかわらず、そのような現状を抱えてしまうのか、一緒に考えていきましょう。

先が見えない現状を踏まえ、課題として考えられるものは以下のどれかに該当するでしょう。

  • プログラミングの上達が見えない
  • プログラミングを継続できない気がする
  • プログラミングスキルを習得した姿がイメージできない
  • プログラミングスキルを活かした仕事を獲得するイメージができない

これらのどれかに該当することによって、「なんとなくプログラミング学習をしている」という状態になってしまいます。

これらの要因は、三日坊主になる理論と同じなんですが、「プログラミング学習をしなきゃ」とプログラミング学習を頑張ってしまっている状態になってしまっています。

受験勉強をやった経験のある方なら頭がもげるほどに首を縦に振ってしまう方も多いのですが、「今日も5時間勉強するぞ」や「今日はこの章を終わらすぞ」というように、学習を進めることに意識が行き過ぎてしまうと、ある程度学習を継続した後に「先が見えない・・・」となってしまいます。

未来に光を当て、プログラミング学習を「成果が出るもの」にするために

先ほど、「なぜ先が見えないという悩みや不安を抱えてしまうのか」という疑問に対しての答えを示していきました。

これらの課題というのは、独学をしていれば9割の方がぶつかってしまう壁だそうで、いわば、あるあるの現象なのです。

独学をしていて、「なんか前に進めていないぞ」と感じるのはこのせいなんですね。甘く見がちですが、非常にやっかい。

これがさらにやっかいさを極めているのは、上記に挙げた課題のほとんどが、1人で解決できないものばかりだからです。

実は、これらのほとんどが経験者に助けてもらいながら解決しないと、すぐに違う方向へと流れてしまいます。

そう言い切れるのは、以前の私もそうだったからです。

エンジニアやプログラマー関連のキャリアに詳しい方や現役のエンジニアに相談しながら修正を加え、学習を実践して今があります。

そうは言っても、周りにそういう人がいないし・・・

という方もいるでしょう。そういう時にこそ、プログラミングスクールの無料カウンセリングを利用するのです。

営業をかけられて時間の無駄に終わるでしょ?

という考えに辿りついてしまいますよね。結論から言うと弊社では、そういった強引な営業等を行うことはありませんので、安心して受講できます。

「プログラミング学習の先ある未来」を光で明るく照らすには、弊社の無料カウンセリングがぴったりだと断言できます。それくらい無料カウンセリングに自信を持っているのです。

さらに、無料カウンセリングには以下の3大特典もついてきます!

  • 「最短1ヶ月で開発ができる学習方法」電子書籍(非売品)
  • 効率的なオリジナル学習カリキュラム
  • 未経験の転職(フリーランス)を可能にするキャリアサポート

上記の特典だけでも他のスクールにはないポイントだと自信を持っている無料カウンセリング特典です。

ただプログラミング学習をする毎日から、ワクワクしながらプログラミング学習できる毎日に変える体験を一度でいいのでしてみませんか?

無料カウンセリング予約はこちら

まとめ

いかがでしたでしょうか?この記事では、defでのメソッドの定義を解説しました。

まず基本的な内容では

  • defを使って基本的なメソッドの定義方法
  • selfの使い方
  • returnの扱い方

を説明し、応用編では

  • 引数を設定する方法
  • defined?メソッドで、メソッドが定義されているか確認する方法
  • aliasメソッドで別名を付ける方法
  • yieldでブロックをメソッドに渡す方法
  • define_methodで動的にメソッドを定義する方法

を解説しました。

メソッドの定義にはさまざまなパリエーションがあって楽しいですね。ぜひこの記事をなんども読んでメソッドの扱い方をマスターしてください。もしdefでのメソッドの定義について忘れてしまったらこの記事を確認してくださいね!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次