Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

その場でRuby列挙子を作成する

コレクションを列挙子として扱うと、追加のコードを記述しなくても、#mapや#reduceなどのお気に入りの関数をすべて使用できるようになります。とても素晴らしいです。

昔は、列挙子を定義するのは少し面倒でした。新しいクラスを作成し、Enumerableモジュールを含め、#each関数を定義する必要がありました。

ただし、Ruby 1.9以降、列挙子をその場で定義するためのはるかに軽量な方法があります。見てみましょう。

列挙子クラスの紹介

Enumeratorクラスでは、ブロック構文を使用して1回限りの列挙子を定義できます。以下の例では、無限の一連の乱数を返す列挙子を作成します。

e = Enumerator.new do |y|
  loop do
    y << rand(10) # The << operator "yields" a value.
  end
end

# Make the enumerator "yield" 10 values, then stop
puts e.first(10).inspect # => [6, 6, 7, 2, 2, 9, 6, 8, 2, 1]

シフト演算子<<を使用していることに気付いたかもしれません。 奇妙な方法で。これは、y.yieldのショートカットです。 方法。列挙子の項目ごとに呼び出します。これがすべてあなたにとって少し魔法のように思えても、心配しないでください。です。

コレクションサイズ

コレクションのサイズを把握することは、Rubyの怠惰な列挙子にとって問題となります。コレクション内のアイテムをカウントするには、コレクション全体をロードする必要があります。これは、遅延列挙子を使用するという全体的なポイントに反します。

回避策があります。列挙子を作成するときにコレクションのサイズがわかっている場合は、それを提供できます。

# You can pass the length as an argument to the constructor, if you have it
e = Enumerator.new(10) do |y|
  10.times { y << rand }
end
私の実例

ちょうど昨日、私はHoneybadgerの新しいドキュメントサイトで作業していました。 Jekyllを使用して構築されており、<h2>に基づいて目次を作成するプラグインを作成していました。 および<h3> ドキュメント内のタグ。

どの<h3>かを判断するのはちょっと厄介です タグは、<h2>で定義されたセクションに属しています タグ。 nokogiriを使用してHTMLを解析してから、結果のドキュメントをスキャンする必要があります。そこで、そのコードを抽象化して列挙子にしました。外観は次のとおりです。

def subheadings(el)
  Enumerator.new do |y|
    next_el = el.next_sibling
    while next_el && next_el.name != "h2"
      if next_el.name == "h3"
        y << next_el
      end
      next_el = next_el.next_sibling
    end
  end
end

  1. Ruby内部:Rubyオブジェクトのメモリレイアウトの調査

    Ruby内部のクイックツアーをご希望ですか? その後、あなたは御馳走になります。 なぜなら … Rubyオブジェクトがメモリ内にどのように配置されるか、そして内部データ構造を操作していくつかのクールなことを行う方法を一緒に探求します。 シートベルトを締めて、Rubyインタープリターの奥深くへの旅の準備をしてください! アレイのメモリレイアウト 配列を作成するとき、Rubyはそれをシステムメモリと少しのメタデータでバックアップする必要があります。 メタデータに含まれるもの : 配列サイズ(アイテム数) アレイ容量 クラス オブジェクトのステータス(凍結されているかどうか) データが

  2. Rubyのケースステートメントの多くの用途

    if / elsifを使用する必要があるときはいつでも 代わりにRubyのcaseステートメントを使用することを検討できるステートメント。この投稿では、いくつかの異なるユースケースと、それが実際に内部でどのように機能するかを学びます。 注:他のプログラミング言語では、これはスイッチとして知られています。 ステートメント。 Rubyのcaseステートメントのコンポーネント: キーワード 説明 ケース ケースステートメントの定義を開始します。使用する変数を取得します。 いつ 一致する可能性のあるすべての条件は1つのwhenステートメントです。 その他 一致