【Ruby入門】yieldの使い方まとめ

ruby1
長瀬来
書いた人 長瀬来
侍エンジニア塾ブログは、未経験からWebアプリ開発と仕事獲得をサポートする
侍エンジニア塾のオウンドメディアです。
プログラミング学習を覗き見

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

Rubyをお使いの方で、普段yieldを活用されていらっしゃる方はどのくらいいらっしゃるでしょうか?

名前だけはなんとなく聞いたことがあるけれど、人に説明しようとしたとき言葉に出なかったり、具体的なコードの書き方や引数については理解していないので、知ってるけど使わない、そんな状態になっていたりはしないでしょうか。

この記事ではrubyのyieldについて

・yieldとは
・yieldの使い方

という基本的な内容から、

・yieldの意味
・yieldに引数とブロック引数を同時に渡す

といった応用的な内容についても解説していきます。

yield基本編

yieldとは

yieldという英単語を日本語に訳すと「産する、もたらす、生む、引き起こす」など、いろいろな意味があります。

Rubyにおけるyieldの意味としてしっくりくるのは「他のものに取って代わられる」でしょう。

そんなyieldを一言で説明すると何と表現できるでしょうか。

一般的にRubyのメソッド引数には、数値や文字列など単体のオブジェクトを渡すこともできるのですが、実はブロックというものを渡すこともできます。

ブロックとは「メソッド呼び出しの際に引数と一緒に渡すことのできる処理のかたまり」です。

yieldは「渡されているブロックと同じ働きをするメソッドのようなもの」とも言えるでしょう。

これだけですとyieldの意味・価値、使い方がイメージしづらいと思いますので、以降でサンプルコードを交えながら説明していきます。

yieldの使い方

実際にコード上でyieldを使うとしたらどのような使い方をするのかを見ていきましょう。下記がサンプルコードです。

実行結果

とても単純なコードですね。

testメソッドを呼び出すと、呼び出したときに渡されたブロック(この場合は「puts “hoge”」)がyieldによって呼び出されています。

yieldの意味

さきほどのサンプルコードでは当然のように、ブロック引数をfooに渡していますが、実はrubyではすべてのメソッドがデフォルトでブロック引数を受け取れるようになっています。

だから、特になにも引数に指定しなくてもブロックを渡すことができたのです。

ブロック引数とはその名前のとおり、メソッドでブロックを受け取るための引数のことです。(そのままですね)

ちなみに念を押しますが、rubyでは{}do~endで囲まれた部分のことをブロックといいます。

ここでの解説はブロックについては理解しているものとして話を進めているのです、理解が浅いと思った人は以下の記事を参考にしてみてください。

つまり、さきほど紹介したサンプルコードではブロック引数を渡しています。

なので、省略せずに書くと以下のようになります。

&procでブロック引数をとることを明示しています。

ここで、

block(ブロック)といっているのになんでprocなんですか?

と思った方はセンスありです。

そうです、rubyの世界で存在するものはすべてがオブジェクトであり、ブロックはオブジェクトではないのでブロック単体では存在を維持することができません。

そこで、ブロックをProcオブジェクトとして扱うことによって、初めてブロックは引数として受け渡しが可能になります。

Procについてはこちらの記事で説明していますので、理解が浅いと思った方は参考にしてみてください。

つまり、ブロックだけでは力不足なのでProcオブジェクトの力を借りるというようなイメージです。

このように、実はyieldは受け取ったブロック引数を展開するためのメソッドなのです。

次に、ブロック引数のなぞが解けたところで、yieldそのものが意味するところに迫っていきましょう。

さきほどのサンプルコードはさらに省略せずに書くことが可能です。

Procオブジェクトはcallメソッドで、ブロックを展開できます。

勘のいい人はもうお気づきかと思いますが、yieldとは実はProcオブジェクトとして存在するブロックを展開するという意味だったのです。

一番はじめの例をyieldを使わずに書いてみます。

実行結果

yield本来の姿に置き換えただけですので、問題なく動きますね。
yieldの謎が解けて、すっきりしました。

yield応用編

yieldに引数とブロック引数を同時に渡す

では次にyieldに普通の引数とブロック引数を同時に渡す方法を見ていきます。

以下がサンプルコードです。

実行結果

2回目のfooメソッド呼び出し時にブロック「p “foo”」を渡すことでyieldによりそのブロックが実行されています。

block_given?はもしもブロック引数が渡されているのならtrueを返すメソッドです。

なので、後置ifで if block_give?としておけば、ブロックが渡されないときでもyieldを無視できます。

if文の使い方はこちらを参考にしてください。

こうしておかないと、もしもブロック引数が存在しない場合にはエラーとなってしまうのでブロックを引数が必ず必要なメソッドでない限り記述する必要があります。

また、さきほど同様にyieldを使わずに書き直すと以下のとおりです。

実行結果

問題なく動きます。

まとめ

今回の記事では、Rubyにおけるyieldについてまとめました。

yieldは省略の結果生まれたものなので、必ずyield本来の姿をイメージできるようにしておいてください。

yieldの中身がわかっていれば、yieldと書くだけでブロック引数を返してくれるので、とても便利ですね。

もしyieldについて忘れてしまったらこの記事を確認してくださいね!

Rubyカリキュラム無料公開中!
この記事はRuby入門完全攻略ガイド【基礎学習/アプリ開発/仕事獲得】の一部になります。このカリキュラムは、プログラミング入門者が、基礎学習からアプリ開発、さらには仕事獲得まで体系的に学べる内容となっています。

Ruby学習に必要な情報を一つにまとめていますので効率よくRubyを学ぶことが出来ます。この機会に是非活用していただければと思います。


33歳、未経験だった僕がフリーエンジニアになれた理由
現在フリーでWEBエンジニアをやられている濱口直行さん。33歳で、プログラミングを学び始め、約半年という短い期間で独立までされた学習ログを余すことなくインタビューさせていただきました。

プログラミングを学習中の方はもちろん、独立をお考えの方まで幅広く活用できる記事になっています。この機会に是非活用していただければと思います。


Rubyを最短で習得したい方へ
近年では様々なWEBサービスが流通するようになりました。

WEBサービスの普及が進むにつれて、それらを素早く開発するのに長けたRubyの人気は今後さらに増し、Rubyエンジニアの需要も自ずと増えることは間違いなしでしょう。

元々ITリテラシーの高い方や他言語を習得している方であれば、独学でRubyを習得することが可能です。

ただし、プログラミング学習をしている方の多くは

「自分に合った教材が見つけられずに挫折してしまった」
「勉強のための勉強になってしまい、ゴールが見えない」
「情報が少なくどう調べればいいかわからない」
「エラーを解決するのに何日もかかってしまう」
このような悩みを抱えたまま挫折してしまうのが現実となっています。

  • もう挫折したくない
  • 本業と両立しながら、好きな時間で自分のペースで勉強を続けていきたい
  • 自分だけのカリキュラムで効率的に勉強したい
  • WEBアプリケーション開発までしっかりサポートして欲しい
そんな方はお気軽に侍エンジニア塾までご相談ください。

お一人お一人に専属のインストラクターがつくので、初心者の方がつまづきがちな、「CookPad」、「Wantedly」、「食べログ」のようなWEBアプリケーション開発方法もスムーズに学習することできます。

実際にオリジナルWEBアプリを開発し、成果物として認められて仕事獲得に成功した塾生は数多くいます。

このように、オリジナルアプリ開発から仕事獲得まで徹底的にサポートすることでプログラミング初心者の方でも安心して基礎学習に取り組むことができます。

まずは『無料体験レッスン』で、弊社のコンサルタントと一緒にあなた専用の学習方法やカリキュラムを考えてみませんか?

Rubyならではの学習方法や、現役フリーランスRubyエンジニアから貴重なアドバイスを受けることができます。

詳しくは下の画像から弊社サービス内容をご確認ください。

ruby_a2

学習者インタビュー

人気講師インタビュー

人気記事セレクション

プログラミング学習者必見

専属講師に質問し放題、レッスンし放題!最短1ヶ月でフリーランスエンジニア
プログラミング学習カリキュラム無料公開中
Ruby学習カリキュラム無料公開中
Python学習カリキュラム無料公開中
 1記事最大11,000円!テックライター募集


LINEで送る
Pocket

この記事が気に入ったら
いいね!をしてフォローしよう

最新情報をお届けします

書いた人

長瀬来

長瀬来

Unityを使ったiOSアプリのリリース、フリマサイト運営の経験があります。

経験した言語はC、C#、Javascript、R、Python、Ruby、PHPなど

言語が好きで、英語や中国、ドイツ語を勉強しました。
将来的には海外で生活したいです。

現在はRuby on Rails5やCocos2dxの勉強を主にしています。
人工知能のアルゴリズムにも興味があります。

ライターとしては
できるだけ初心者にわかりやすい文章になるように心がけています。

趣味は語学、読書、ピアノ、ジャグリング、フルートなどです。

連絡先はこちらです。
[email protected]