Hammiche :
Le yield(:toto) permet simplement d’accéder à ce qui est créé par le
content_for(:toto) { … }.
Avant on utilisait une variable d’instance @content_for_toto mais
comme un peu sur tout, on tente d’utiliser des accesseurs pour
plus d’abstraction. Ils ont simplement eu la mauvaise idée de
réutiliser le mot clé “yield” des blocs en se disant que le concept
était assez similaire.
Je pensais qu’il s’agissait de la méthode yield standard de ruby
définie dans generator.rb
Non, yield est un mot-clé de Ruby.
yield utilise la notion de continuation concept très ésotérique
pour moi. il faudrait que j’étudie ça un jour
Non, ce n’est pas du tout comme cela que je le comprends.
Dans une méthode, yield permet d’exécuter le bloc de code
(le block) attaché lors de l’appel de cette méthode.
yield ne sert pas qu’à ça, mais ça sert entre autres à
itérer sur une collection d’objets.
class Foo
def initialize(n)
@n = n
end
def each
0.upto(@n) { |i| yield i }
end
end
Foo.new(5).each { |elem| puts elem }
donc là c’est comme si j’avais un objet collection d’entiers
de 0 à 5, collection que je peux parcourir.
Generator va me fournir un itérateur à partir de mon objet.
Il peut également en créer un à partir d’un bloc, où les
éléments seront fournis via un appel #yield, pour copier
l’utilisation de yield comme dans ma méthode #each au-dessus.
exemple :
n = 5
g = Generator.new do |g|
0.upto(n) { |i| g.yield i }
end
Et on voit que l’écriture est proche car ça a été étudié
pour
Après, dans Generator, comment fonctionne #yield ?
Yields an element to the generator.
def yield(value)
if @cont_yield = callcc { |c| c }
@queue << value
@cont_next.call(nil)
end
Ben, il utilise les continuations.
Donc dans ce cas précis de Generator, yield est en
quelque sorte lié à la notion de continuation, mais
pas en général.
yield est lié aux blocks donc plus ou moins à la notion
de fermeture (closure).
Enfin, Matz avait laissé supposé qu’il allait laisser tomber
les continuations dans Ruby 1.9.1 (mais je ne sais pas
s’il a changé d’avis). Par contre s’il décidait de laisser
tomber yield, donc les blocks, Ruby ne serait plus Ruby
– Jean-François.