2016-03-30 3 views
0

У меня есть строка:Enumerator изменения к другому классу

bottom_line = "some text" 

Когда я создаю перечислитель из него с enum_for и попытаться вызвать each на нем, я получаю сообщение об ошибке:

z = bottom_line.enum_for 
z.each {|item| item.scan(/some_regex/)} 
# => undefined method `each' for #<String:0x00000001f65350> 

Что здесь происходит?

Когда я цепь enum_for с методом все в одной строке, это работает:

z = bottom_line.enum_for(:scan, /some_regex/) 
+0

Спасибо за четкое объяснение Cary - Я пытался смотреть на документацию предварительного но посмотреть на документацию Enumerator, и я Ждут» t понять, что он прошел метод #each до класса базового объекта, String в этом случае –

ответ

0

z.each вызывает метод Enumerator#each для отправки z. Enumerator#each приобретает класс приемника enum_for (bottom_line), который составляет String. Затем он вызывает вызов метода String#each. Он не находит такой метод экземпляра в классе String, поэтому он вызывает исключение, которое вы получили.

2

Перед тем, как задать вопрос, вы можете взглянуть на документацию по адресу Object#enum_for.

Object#enum_for принимает 1+ параметры: метод, который будет вызываться при фактическом вызове перечисления (по умолчанию - :each), и переданные аргументы, которые должны быть переданы этому методу.

Это говорит,

z = bottom_line.enum_for 

абсолютный эквивалент:

z = bottom_line.enum_for(:each) 

в то время как встраиваемая версия

z = bottom_line.enum_for(:scan) 

почему вы бы ожидать, что они ведут себя так же? Для того, чтобы достичь той же функциональности можно явно указать метод в вызове enum_for:

z = bottom_line.enum_for :scan 
z.each(/some_regexp/) { |item| puts item } 
+0

, поддержанный для * просмотра документации перед запросом * note – joanbm

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