Je voudrais écrire une méthode qui donne des valeurs à un endroit et les passe en paramètre à une autre méthode qui l'invoquera avec un bloc. Je suis convaincu que cela peut être fait mais je n'arrive pas à trouver la bonne syntaxe.comment passer un itérateur Ruby en tant que paramètre?
Voici quelques exemples de code (non-travail) pour illustrer ce que je suis en train de réaliser:
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, dans mon code réel, Yielder et l'utilisateur sont dans différentes classes.
Mise à jour
Merci pour vos réponses. Comme Andrew Grimm l'a mentionné, je veux que la méthode de l'itérateur prenne des paramètres. Mon exemple original a laissé ce détail. Cet extrait fournit un itérateur qui compte jusqu'à un nombre donné. Pour que cela fonctionne, j'ai rendu le bloc interne explicite. Ca fait ce que je veux, mais c'est un peu moche. Si quelqu'un peut améliorer cela, je serais très intéressé de voir comment.
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))
Eh bien, un échantillon de travail serait beaucoup mieux. – Reactormonk
@Tass: Je pense que le code epicsmile est adéquat pour nos besoins. –
Après quelques expérimentations à l'aide des réponses déjà données, j'ai trouvé un exemple de travail et je l'ai ajouté comme réponse ci-dessous. – epicsmile