Я изучаю магию Enumerable в Ruby. Я слышал, что нужно просто включить Enumerable
и реализовать метод each
, и для этого класса могут быть возможности Enumerable.
Итак, я подумал о реализации собственного пользовательского класса Foo для практики. Это выглядит следующим образом:
class Foo
include Enumerable
def initialize numbers
@num = numbers
end
def each
return enum_for(:each) unless block_given?
@num.each { |i| yield i + 1 }
end
end
Этот класс принимает массив, и его each
работает почти так же, как Array#each
. Вот разница:
>> f = Foo.new [1, 2, 3]
=> #<Foo:0x00000001632e40 @num=[1, 2, 3]>
>> f.each { |i| p i }
2
3
4
=> [1, 2, 3] # Why this? Why not [2, 3, 4]?
Все работает так, как я ожидаю, кроме одной вещи, которая является последним утверждением. Я знаю, что это возвращаемое значение, но не должно ли оно быть [2, 3, 4]
. Есть ли способ сделать это [2, 3, 4]
.
Также, пожалуйста, прокомментируйте, как я реализовал each
. Если есть лучший способ, пожалуйста, дайте мне знать. Сначала в моей реализации у меня не было этой строки return enum_for(:each) unless block_given?
, а потом она не работала, когда не было предоставлено никакого блока. Я откуда-то позаимствовал эту строчку, а также, пожалуйста, скажите мне, правильный ли это способ справиться с ситуацией или нет.