Quelqu'un pourrait-il peut-être m'aider à comprendre la différence entre "céder Self" et "rendement"?
class YieldFirstLast
attr_accessor :first, :last
def initialize(first = nil, last = nil)
@first = first
@last = last
yield self if block_given?
end
def hello
puts "#{@first} #{@last} says hello!"
end
end
3 Réponses :
Cellation auto code> entre le bloc, associé à l'appel de la méthode, le passage de l'objet actuel en tant qu'argument sur le bloc, le simple le rendement code> passe simplement dans le bloc sans passer des arguments sans faire passer des arguments. P >
Dans le cas de Cellation auto code>, auto code> est l'argument transmis au bloc. Avec simplement rendement code>, aucun argument n'est passé. auto code> n'est pas spécial ici, tout pourrait être cédé, par exemple
Et s'il y a plus d'un argument transmis au bloc? Est-ce que vous êtes un tableau d'entre eux?
Self Code> est une référence à l'instance, mais comme je l'ai dit, rien de spécial ici. Pensez essentiellement que le rendement est une méthode qui prend des arguments et les transmet au bloc. Voir la modification pour plusieurs arguments.
Merci pour cette explication. Permettez-moi de vérifier ma compréhension, alors lorsque nous utilisons soi-même, X est attribué en tant que référence d'objets actuels. Mais si nous n'utilisons pas soi-même, X n'est attribué à aucun objet.
Oui, il peut être utile de penser que le bloc comme méthode et rendement code> comme invocation de cette méthode. Le bloc {| x, y | x + y} code> est analogue à def fn (x, y) x + y extrémiser code>. Si vous avez appelé fn code> sans argument, fn () code>, vous vous attendez à x code> non défini dans le corps de la méthode, oui?
penser au rendement code> comme appelez votre bloc et votre Self code> invoque votre bloc avec l'instance actuelle comme paramètre. P>