2013-07-15 3 views
5

Предоставляет ли Ruby какой-либо механизм, позволяющий итератору до yield использовать все значения из другого итератора? (или «субтитровщик», я не уверен, что такое собственное имя). Подобно Python3.3 + 's yield fromВывести все значения из другого итератора

def f 
    yield 'a' 
    yield 'b' 
end 

def g 
    # yield everything from f 
    yield 'c' 
    yield 'd' 
end 
+0

'е {| х | yield x} 'слишком долго? :) –

+0

@JoachimIsaksson, если 'f' дает несколько значений, оно начинает –

+0

, хотя я полагаю {| * x | yield x} будет в порядке, но idk, если есть какие-то тонкости, которые мне не хватает. Но я искал что-то, что обрабатывает все, что может произойти при нормальных взаимодействиях с итераторами (исключениями и еще нечеткими) без каких-либо специальных –

ответ

4

Это, вероятно, наиболее идиоматических подход:

def f 
    yield 'a' 
    yield 'b' 
end 

def g(&block) 
    f(&block) 
    yield 'c' 
    yield 'd' 
end 
3

Один из способов заключается в следующем:

def f 
    yield 'a' 
    yield 'b' 
end 

def g 
f &Proc.new # 'duplicate' the block given to g and pass it to f 
yield 'c' 
yield 'd' 
end 
+0

Я понятия не имел, что это возможно. Можете ли вы дать некоторую ссылку? почему 'Proc.new' - это дубликат блока, а не пустой proc? он выглядит несколько загадочным с первого взгляда. – tokland

+2

[docs] (http://www.ruby-doc.org/core-2.0/Proc.html#method-c-new) определяют это поведение :). – nicooga

+1

Это грустно, потому что я искал документы, читал эти строки и не смог подключить точки :-(Я боюсь, что это слишком явно для моего вкуса. Я не помню, чтобы найти код, который использует «функцию», Я не единственный. Это прекрасно отвечает на вопрос, хотя, так что +1 – tokland

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