Rubyブロック漫談I

2048 ワード

Rubyのブロックブロックはrubyの重要な特性であり、ユーザーが一連のカスタム操作(はっきり言えばコードの塊)をパラメータのように方法に渡すことができ、ブロックを受け入れる方法はブロックを実行する方法と回数を決定し、rubyの中で最もよく見られるブロックを使用する場所はいくつかのループの方法であり、ループの要素をブロックの論理で順次実行する.もちろん、具体的な状況は大きく異なり、自分のブロックを受け入れる方法をカスタマイズすることもできます.
コード抽象能力の向上
まず簡単な例を見てみましょう.
[1, 2, 3, 4, 5].each do |i|
     puts i ** 2
end

例の意味は明らかで、配列の中の各数字を循環して、毎回この数字の平方数を標準出力インタフェースに印刷します.
eachメソッドはただ1つの遍歴の方式を提供して、具体的に実行するロジックはユーザーが使用する时に具体的に制定して、これは実はまた1时のテンプレートの方法の意味の中で、抽象的なテンプレートの方法はただ基础の骨格を提供して、具体的な方式は使用する时に后で缚って、一定の抽象的な目的を达成して、もちろんここはただ类比して、eachは実際にはEnumeratorを返し,各データを反復するとブロックの論理を実行する.
ブロックの役割を理解するときは、コードの抽象能力を向上させることに重点を置くべきであり、コードを書く非常にプロセス化を避ける必要があります.
コード多重化
タイトルのように、blockの方式もコード多重化の能力をよく提供することができ、例によって始めます.
>> [1, "5", 2, "7", "3"].sort_by { |a| a.to_i }
=> [1, 2, "3", "5", "7"]

配列と文字の2つの内容を含む混合配列を並べ替え、並べ替えの論理はそれらを数字に変換して比較することである.ブロックがなければ、私たちは実現する時に手動で比較を循環して変換するしかありませんが、このようにして1つの問題が発生します.10種類の異なる方法のソートでは、10回の差の少ない論理を実現しなければなりません(比較の方法だけが異なるので)、コードは非常に冗長で維持しにくいです.
Enumerableモジュールからのmixinの配列のすべての方法は、上記の例のsort_を含む.byメソッドは一般的な論理を含めており,ユーザが集合やカスタムデータ型を消費する際にmixin方式でこれらの抽象的な処理方法を得た後に使用する際に,自分の論理を注入して所望の効果を達成するのに便利である.
だからコード度は絶対にブロックの後に優雅で実用的な機能と言える.
ブロックのカスタマイズ方法
ブロックの使用を許容できる方法をカスタマイズすることは非常に簡単で、yieldによって方法とブロックを合理的に中断し、交互に実行する論理だけでなく、yieldも両者の間でデータを容易に伝達することができる.
yieldは実際にはそれほど不思議なものではありません.率直に言って、現在の論理を一時停止してから、あなたが設定した他の場所に移動して実行を続け、nextが呼び出されたときに再び以前の一時停止した場所に戻り、最もよく使われているのは無限反復を実現するためです(前の情報/状態だけを保存するため)、他の高度な機能は具体的な言語を見なければなりません.
def total(from, to)
  result = 0
  from.upto(to) do |num|
    if block_given?
      result += yield(num)
    else
      result += num
    end
  end
  return result
end

p total(1, 10)     #=> 55
p total(1, 10){|num| num ** 2 }  #=> 385

ブロックの第1部については、ブロックの制御、ブロック局所変数、ブロックをProcオブジェクトにカプセル化する方法、Procオブジェクトを受け入れる方法、カスタムメソッドがProcオブジェクトにカプセル化されたブロックを使用する場合、実装されたいくつかの領域、およびProcがもたらす多重ブロックのような論理的ないくつかの利点など、残りの詳細について説明しましょう.