2011-12-14 2 views
3

私はRubyを学び、配列クラスで 'each'がどのように実装されているか知りたいと思っています。私は1つを見たdocumentation hereそしてこれは「each」が書かれる方法であるように見える;ruby​​で 'each'を使って "each"関数を実装しました

# within class Array... 
def each 
    for each element 
    yield(element) 
    end 
end 

私はまさにこの構文エラー

:SyntaxError: (irb):2: syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '(' 
(irb):5: syntax error, unexpected keyword_end, expecting $end 

をルビーコンソールで(コメント#なし)上記のコードを書く(私は1.9.2を使用しています)となったのは、この起こっているのために不完全な配列クラスの実装(つまり、 '要素'は定義されていないか、何かのためにこれがありますか?また、 'each'やその他の基本機能の実装方法も知りたいと思います。これが重複しているかどうか私に教えてください(似たような質問はありませんでした)。ありがとう

答えて

7

まず、for文の構文はオフです。for element in elementsのようなものでなければなりません。elements.each { |element| ... }とほぼ同じですが、新しいスコープを導入しない点が異なります。

>> for element in nil 
.. end 
NoMethodError: undefined method `each' for nil:NilClass 
    from (irb):1 

あなたの構文エラーについて:あなたがクラスを再開しているので、ときルビーあなたは何も定義されeach方法を持っていない方法でそれを呼び出すようにしようとすると分かるように、実際にはforは、eachを使用して実装されていますパーサーはスタンドアロンeachが受信者としてselfを使用することを確認して、に翻訳します。elementtIDENTIFIERですが、self.each do |element| ... endのようなものが予想されます。

Array#eachの実装としては、それはCで実装されますと、これは基本的にこの

VALUE 
rb_ary_each(VALUE array) 
{ 
    long i; 
    volatile VALUE ary = array; 

    RETURN_ENUMERATOR(ary, 0, 0); 
    for (i=0; i<RARRAY_LEN(ary); i++) { 
     rb_yield(RARRAY_PTR(ary)[i]); 
    } 
    return ary; 
} 

のように見えますがC.

11

にRubyで記述しようとしたものをあなたはこれを行うことができます(ドン」トン)inを欠場:

class Array 
    def each 
    for element in self 
     yield element 
    end 
    end 
end 

しかし、実際には、次のとおりです。

for element in arrayarray.each

のシンタックスシュガーは、したがって、上記のコードでは、このに変換されます。

class Array 
    def each 
    each do |element| 
     yield element 
    end 
    end 
end 

そして、あなたはstackoverflowの。

0

Array#eachはRubyで作成されています。どんな宝石にも貼られていません。 0から配列の大きさの範囲をループすることにより、ドキュメントhere

0

ことが可能ですを参照してください

class Array 
    def each 
    for i in 0...self.size 
     yield self[i] 
    end 
    end 
end 

例(除外):

[1,2,3].each {|i| puts i} 
1 
2 
3 
それが動作

関連する問題