Я хотел бы написать метод, который дает значения в одном месте и передает его как параметр другому методу, который будет вызывать его с помощью блока. Я убежден, что это можно сделать, но почему-то я не могу найти правильный синтаксис.как передать итератор Ruby в качестве параметра?
Вот некоторые примеры (нерабочим) код, чтобы проиллюстрировать то, что я пытаюсь достичь:
def yielder
yield 1
yield 2
yield 3
end
def user(block)
block.call { |x| puts x }
end
# later...
user(&yielder)
$ ruby x.rb
x.rb:2:in `yielder': no block given (yield) (LocalJumpError)
from x.rb:12:in `<main>'
FWIW, на мой реальный код, yielder и пользователь в разных классах.
Update
Спасибо за ваши ответы. Как упоминал Эндрю Гримм, я хочу, чтобы метод итератора принимал параметры. Мой оригинальный пример оставил эту деталь. Этот фрагмент предоставляет итератор, который подсчитывает до заданного числа. Чтобы он работал, я сделал внутренний блок явным. Он делает то, что я хочу, но это немного уродливо. Если кто-то может улучшить это, мне было бы очень интересно посмотреть, как это сделать.
def make_iter(upto)
def iter(upto, block)
(1 .. upto).each do |v|
block.call(v)
end
end
lambda { |block| iter(upto, block) }
end
def user(obj)
obj.call Proc.new { |x| puts x }
end
# later...
user(make_iter(3))
Ну, рабочий образец будет намного лучше. – Reactormonk
@Tass: Я думаю, что показанный код epicsmile является адекватным для наших целей. –
После некоторых экспериментов с помощью уже полученных ответов я придумал рабочий пример и добавил его в качестве ответа ниже. – epicsmile