【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 on Railsのフリーランスは高収入でおすすめ!

    Rubyができる方は多くはいないのが現状です。 プロジェクトは右肩上がりで増えているので、エンジニアが全く足りておりません。 Rubyの実務経験が1年以上ある方はフリーランスになることもできるので、ぜひご興味があればポテパンの無料カウンセリングをご利用下さいませ! Ruby案件に関する情報は下記にまとまっていますのでぜひご覧下さい。

    Ruby on Rails案件のイマがわかる!知って見つかる最適案件


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

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

    ポテパンフリーランス

    ポテパンフリーランス

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

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。年収800万円以上のハイスペック転職をご希望の方は「ポテパンプロフェッショナル」もご用意しておりますのでご利用下さいませ。

    ポテパンキャンプ

    ポテパンキャンプ

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



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

    ポテクラバナー ポテプロバナー

    この記事をシェア

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









    ABOUT US

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

    READ MORE