2014-12-22 1 views
3

Ruby определяет большинство методов итератора в перечислимом числе и включает в себя массив, хэш и т. Д. Однако each определен в каждом классе и не включен в перечисляемый.Почему «каждый» в рубине не определен в перечислимом модуле?

Я предполагаю, что это был преднамеренный выбор, но мне интересно, почему?

Есть ли технические ограничения относительно того, почему each не включен в Перечисляемый?

+1

Как бы реализовать это? –

ответ

6

Из документации для Enumerable:

перечислимого Mixin предоставляет классы коллекций с несколько обходом и методами поиска, а также с возможностью сортировки. Класс должен предоставлять каждый метод, который дает последовательные элементы коллекции.

Так Enumerable модуль требует, чтобы классы, которые включают в себя его реализации each самостоятельно. Все остальные методы в Enumerable зависят от each, реализуемого классом, который включает Enumerable.

Например:

class OneTwoThree 
    include Enumerable 

    # OneTwoThree has no `each` method! 
end 

# This throws an error: 
OneTwoThree.new.map{|x| x * 2 } 
# NoMethodError: undefined method `each' for #<OneTwoThree:0x83237d4> 

class OneTwoThree 
    # But if we define an `each` method... 
    def each 
    yield 1 
    yield 2 
    yield 3 
    end 
end 

# Then it works! 
OneTwoThree.new.map{|x| x * 2 } 
#=> [2, 4, 6] 
+0

Спасибо, что оценили Ajedi32 – mrageh

 Смежные вопросы

  • Нет связанных вопросов^_^