Во-первых, синтаксис вашего оператора for
отключен, он должен выглядеть примерно так: for element in elements
, что почти эквивалентно elements.each { |element| ... }
, за исключением того, что он не вводит новую область видимости. Фактически for
реализован с использованием each
, что можно увидеть, когда вы пытаетесь вызвать его для метода, у которого нет определенного each
метода:
>> for element in nil
.. end
NoMethodError: undefined method `each' for nil:NilClass
from (irb):1
Относительно вашей синтаксической ошибки: поскольку вы повторно открываете класс, когда анализатор Ruby видит автономный each
, он использует self
в качестве получателя, поэтому он переводит ваш оператор в for self.each element
, где element
- это tIDENTIFIER
упомянуто, тогда как ожидалось что-то вроде 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;
}
Это в основном то, что вы пытались написать на Ruby в C.