7

列挙可能なオブジェクトenumがあり、3 番目のアイテムを取得したいとします。

一般的なアプローチの1つは、配列に変換してから、次のようなインデックスでアクセスすることです。

enum.to_a[2]

ただし、この方法では一時的な配列が作成されるため、非効率的である可能性があります。

今私は使用します:

enum.each_with_index {|v, i| break v if i == 2}

しかし、これは非常に醜く冗長です。

これを行う最も効率的な方法は何ですか?

4

3 に答える 3

6

take最初の 3 つの要素を剥がしてlastから、配列から 3 番目の要素を取得するために使用できtakeます。

third = enum.take(3).last

配列をまったく生成したくない場合は、おそらく次のようにします。

# If enum isn't an Enumerator then 'enum = enum.to_enum' or 'enum = enum.each'
# to make it one.
(3 - 1).times { enum.next }
third = enum.next
于 2012-06-11T02:06:18.873 に答える
5

enumerable-lazyまたは Ruby 2.1を使用した mu の回答の代替。を使用するのと同じくらい怠惰nextですが、より宣言的です。

enum.lazy.drop(2).first
于 2012-06-11T06:30:41.003 に答える
1

残念ながら、インデックスでメンバーにアクセスするには、配列に変換する必要があります (そうしないと、そもそもインデックスがありません)。そのため、コードは完全に問題ないように見えます。

于 2012-06-11T02:13:13.720 に答える