Магия Enumerator # feed
Существует этот метод # перечисления # перечислителя, который я обнаружил случайно. Он определяется как:
feed obj → nil
Устанавливает значение, возвращаемое следующим выходом внутри e. Если значение не задано, доходность возвращает nil. Это значение очищается после сдачи.
Я изучил примеры и подумал "Yay!", это должно работать с помощью feed
:
enum = ['cat', 'bird', 'goat'].each # creates an enumerator
enum.next #=> 'cat'
enum.feed 'dog'
enum.next #=> returns 'bird', but I expected 'dog'
Но это не сработает. Я предполагаю, что он не возвращает 'dog'
, потому что each
не использует yield
внутренне.
Дело в том, что из приведенного примера в документации я не мог вывести случаи использования в реальном мире, Google не является другом с этим вопросом, и (из того, что я пробовал) feed
, похоже, не хорошо работают с другими методами Enumerator
/Enumeration
.
Можете ли вы, пожалуйста, дать мне хороший пример, который объясняет feed
, так что я могу обойти его вокруг?
Ответы
Ответ 1
def meth
[1,2,3].each {|e| p yield(e)}
end
m = to_enum(:meth)
m.next #=> 1
m.feed "e"
m.next
#printed: "e"
#return => 2
, как вы можете видеть, питание влияет на результат урожая, НО перечислитель
метод должен заботиться о нем
Теперь посмотрим пример вашего:
a = ['cat', 'bird', 'goat']
m = a.to_enum(:map!)
m.next
m.feed("dog")
m.next
m.next
p a #=> ["dog", nil, "goat"]
Работает feed
:
сначала вам нужно позвонить дальше, затем вы вызываете канал, чтобы установить значение, а затем следующий вызов следующего применит изменение (даже если оно поднимет StopIteration error
.)
Подробнее см. здесь: Enum#feed:
. Это имеет правильное объяснение о enum#feed
.