奇妙な列挙子の動作(副作用?)

aherve

Enumerable::takeここで方法については、私にはわからないことがあります。私のコードはn、連続する素数のサイズ配列のリストを生成することになっています。

このnextメソッドを使用すると問題なく動作しtake(n)ますが、説明できないもの返されます。コードは次のとおりです。

編集 ここではshift方法が問題のようです(以下を参照)。理由はまだわかりませんが

require 'prime'

def consecutives(size)
  Enumerator.new do |enum|
    ps = Prime.lazy       # all primes numbers
    a = Prime.take(size)  # itinialize the array
    size.times{ps.next}   # skip the first <size> values from ps
    loop do 
      enum << a           # return result
      a << ps.next        # add next prime number
      a.shift             # remove first item from a
    end
  end
end

c3 = consecutives(3) #create an iterator for arrays of size 3

現在、使用nextは問題なく機能します。

3.times { p c3.next}  #=> [[2,3,5],[3,5,7],[5,7,11]]

take私がまったく得られない何かを返すのに対して

p c3.take(3) #=> [[5, 7, 11], [5, 7, 11], [5, 7, 11]]

ここで何が起こっているのかについて何か考えはありますか?

編集置換a << ps.next ; a.shiftによってa = (a+ [ps.next])[-1..1]実際に問題が解決され、列挙子は期待どおりに動作します。私はまだここで何が起こっているのかわからないので、質問は関連性があると思います。

Sergio tulentsev

問題:

  enum << a           # return result

ここで配列を生成します。またはそう思います。内部では、配列へ参照が渡されます。次に、内部と思われる配列を変更します。実際には、これらの変更は両方の配列に影響ます。これは、メモリ内に実際には1つの配列と、それに対する2つの参照しかないためです。最終的に、同じ1つの配列と4つの参照(1つは内部配列で3つは生成されます)を取得します。

見つかった回避策は、そこで新しい配列を作成するために機能します単に電話.dupするだけでも十分です。

require 'prime'

def consecutives(size)
  Enumerator.new do |enum|
    ps = Prime.lazy      
    a = Prime.take(size) 
    size.times{ps.next}  
    loop do 
      enum << a.dup  # <== here    
      a << ps.next       
      a.shift            
    end
  end
end

c3 = consecutives(3) 

c3.take(3) # => [[2, 3, 5], [3, 5, 7], [5, 7, 11]]

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

gcc7の列挙型と3値の奇妙な動作

分類Dev

列挙型を使用したProtobufの奇妙な動作

分類Dev

動作しない子クラスの列挙リスト

分類Dev

列挙型クラスの値を比較するときの奇妙な動作

分類Dev

親を子にキャスト - 配列の奇妙な動作

分類Dev

AppBarLayoutの子の奇妙な動作

分類Dev

SortedDictionary.ValueCollection動作の列挙子は、他の列挙子とは異なります

分類Dev

非常に奇妙な動作をするJava列挙型

分類Dev

Javaの奇妙な配列の動作

分類Dev

C ++の奇妙な配列の動作

分類Dev

C#の奇妙な文字列の動作?

分類Dev

奇妙な文字列プールの動作

分類Dev

Java文字列の奇妙な動作

分類Dev

PHP連想配列の奇妙な動作

分類Dev

文字列比較C ++での奇妙な動作

分類Dev

Matlab配列での奇妙な動作

分類Dev

C配列での奇妙な動作

分類Dev

奇妙なnull文字列の連結動作

分類Dev

列挙型の逆/シリアル化中のこの奇妙な動作の説明を探しています

分類Dev

パンダデータフレームを使用している間の列挙の奇妙な動作

分類Dev

範囲外の値を持つ列挙型を解析するときの奇妙な動作

分類Dev

副作用で作動する

分類Dev

静的char配列と動的char配列の奇妙な動作

分類Dev

奇妙なconky背景の動作

分類Dev

Java TreeSetの奇妙な動作

分類Dev

Map、parseIntの奇妙な動作

分類Dev

Java OutOfMemoryErrorの奇妙な動作

分類Dev

GregorianCalendarでの奇妙な動作

分類Dev

NumberFormat Javaの奇妙な動作

Related 関連記事

ホットタグ

アーカイブ