【Ruby入門】ブロック
  • facebookページ
  • twitterページ
  • 2017.12.19

    【Ruby入門】ブロック

    本記事では「ブロック」を解説します。

    処理のほんの一部分を別の処理に置き換えたり、その他さまざまなことができます。

    では共通関数やメソッド、クラスのオーバーライドと何がちがう?となりますよね。

    ブロックの基本とその応用について、解説していきます。

    本記事を読み終える頃には、処理を大きく変更することなく部分的に差し替えるなど、効率的にプログラミングできるようになっていますよ!

    ブロックとは?

    ブロックといえば、プログラミングの世界では一般的に{ }で囲われた部分を意味します。

    Rubyにおいても、確かに同じように{ }で囲うこともあります。しかしブロックには「処理のかたまり」という以上の意味があります。

    たいそうに聞こえますが、今までさんざん出てきたといえば驚かれるでしょうか?

    繰り返し処理で普通に使ってきたブロック

    繰り返し行う処理、eachで1から10までを表示させる場合です。

    do 〜 endで囲まれた部分がブロックです。

    このような書き方もあります。

    1行で書くなら・・・

    いずれにせよ、受け取るための変数と、処理する内容を記述するかたまり、という感覚が分かってきたでしょうか?

    ここで|i|に注目しましょう。

    この受け取るための変数をブロック変数といいます。

    処理を隠す

    ブロックは他に、定型処理を隠すという使われ方があります。

    前記事「【Ruby入門】入力と出力」の「6.ブロックでオープン、クローズを省略可」にて解説しましたが、ここで再度詳細を解説しましょう。

    以下が本来のファイルのオープン処理です。

    ブロックを指定するとこうなります。

    2番目の方は、openとcloseがないのがお分かりでしょうか?

    Rubyのマニュアルを見てみましょう。

    ブロックを指定して呼び出した場合は、Fileオブジェクトを引数としてブロックを実行します。ブロックの実行が終了すると、ファイルは自動的にクローズされます。ブロックの実行結果を返します。

    とあります。ということは、File.openはブロックでない呼び出し方をされたときと、ブロックで呼び出されたときで動きがちがうということです。

    しかもそれは、使う側が単に仕様に応じて選択するだけということです。

    処理を一時的に変更する

    ブロックは、処理を一時的に変更するときにも使います。

    配列のソート(整列)を例にとります。

    配列を何らかの規則にもとづきソートさせたいということはよくあります。

    その規則性の数だけメソッドを作っていては、名前と種類、引数の数などを覚えるのが大変です。

    よって、ソートする枠組みだけ用意して、規則はその都度決めようという考えに至ります。

    それがメソッドにブロックを渡すことにより一時的に処理を変更する、という意味です。

    上図は何も渡さなければ文字コード順にソートされますが、ブロックで要素間の関係を渡すと、その順にソートできるということを表現しています。

    何らかの規則性を受け取るとそちらで上書き、といったイメージでしょうか。

    実際にやってみましょう。

    まずは、シンプルにソートさせます。

    [実行結果]

    実はコレ、以下と同じ動きになります。

    実行結果は、先ほどと同じです。

    ここで解説です。

    「a <=> b」とは、以下の結果を返します。

     

    • a < b ならば -1
    • a == b ならば 0
    • a > b ならば 1

     

    ちょっと分かりにくいので、こう説明します。

    要素1 <=> 要素2

     

    • 結果が-1なら要素1、要素2
    • 結果が0ならそのまま
    • 結果が1なら要素2、要素1

     

    この判定を使って、配列の要素を昇順にソートできます。

    では次に、単語数の少ない順に並べましょう。

    [実行結果]

    sortに対して、要素間の関係だけをブロックで渡してソートさせる、ということが理解できたでしょうか?

    ブロックの部分を「{|a, b| b <=> a}」とするだけで逆順にソート、といった柔軟な対応ができます。

    2項目間の関係をブロックで定義しましたが、必ずしも項目間の関係だけでなく、個々の要素に対しての操作も指定可能です。

    [実行結果]

    ブロックつきメソッドを独自に作る

    今度は自分でブロックつきメソッドを作ってみましょう。

    仕様は以下のとおりです。

     

    • ブロックを受け取らないなら 数量:amount × 単価:price
    • ブロックを受け取ればその計算に準ずる

     

    まずは実行側です。

    そして呼ぶ側は以下です。まずは普通に数量×単価です。

    [実行結果]

    次に、消費税込みの金額を出しましょう。

    [実行結果]

    普通はこんな方法をとりませんが、ブロックを渡す・受け取って使う方法を確認するという観点から、あえてこのような例にしました。

    解説

    block_given?で、ブロックが与えられた場合はtrue、そうでないならfalseを得られます。ブロックがない場合は普通に数量と単価をかけています。

    ブロックを得られれば「yield(amount * price)」にて受け取った数量と単価をかけて、その結果を受け取った計算方法に渡しています。

    この場合、数量と単価をかけて、1.08をかけています。結果540円を得たということになります。

    ブロックを渡す、つまりこの場合計算方法もろとも渡してしまう、というのが理解できたでしょうか?

    計算方法は重要ではなく、計算方法そのものを「まるっと」渡している!ということに注目してください。

    まとめ

    本記事では、ブロックについて解説しました。

    方法まるごと渡してしまう、この便利さに少しでも気づいていただけたなら幸いです。

    先の例を使って、さまざまな計算方法を渡してみたりして遊んでくださいね!


    他のRuby入門記事はこちら

    【Ruby入門】Rubyとは何か?学習方法や将来性まで考えました!

    【Ruby入門】Ruby on Railsをやってみよう!

    【Ruby入門】環境構築(Mac/Win)

    【Ruby入門】nokogiriでスクレイピング

    【Ruby入門】データベース

    【Ruby入門】gemとライブラリ

    【Ruby入門】エラーと例外処理

    【Ruby入門】モジュール(module)とMix-in

    【Ruby入門】Procクラスとラムダ(lambda)

    【Ruby入門】ブロック

    【Ruby入門】メソッド

    【Ruby入門】クラスをコーディング(2) オブジェクト指向

    【Ruby入門】クラスをコーディング(1) classを作る

    【Ruby入門】クラスの継承、オーバーライド

    【Ruby入門】クラスとオブジェクト

    【Ruby入門】ディレクトリ(フォルダ)の作成、削除

    【Ruby入門】ファイルの移動、コピー、削除

    【Ruby入門】入力と出力

    【Ruby入門】Rubyの正規表現

    【Ruby入門】正規表現で置換する

    【Ruby入門】正規表現とは何か?

    【Ruby入門】文字列の結合などの操作

    【Ruby入門】CSVの基本と操作

    【Ruby入門】JSONの基本と操作

    【Ruby入門】乱数(Random)などの数値計算用クラスや端数処理

    【Ruby入門】日付の基本と操作(Time, Date)

    【Ruby入門】数値の数え上げ「upto」と四捨五入

    【Ruby入門】文字列の標準ライブラリnkfとヒアドキュメント

    【Ruby入門】数値の基本とメソッド (timesメソッド他)

    【Ruby入門】ハッシュ(hash)をeachで取り出す!その他ハッシュの応用に

    【Ruby入門】ハッシュ(hash)とシンボルの基本

    【Ruby入門】文字列の基本と表示メソッド

    【Ruby入門】Rubyの繰り返しを極める!様々な繰り返しのバリエーション

    【Ruby入門】最初はこれだけ!まずは手を動かしたい人のRuby入門

    【Ruby入門】ifとelseについて

    【Ruby入門】配列と操作(基本編)

    【Ruby入門】eachメソッドの使い方と応用例


    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料10万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテキャンバナー ポテキャリバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア

    関連ワード

    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE