12
votes

Différence entre le rendement personnel et le rendement?

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


0 commentaires

3 Réponses :


5
votes

Cellation auto 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 passe simplement dans le bloc sans passer des arguments sans faire passer des arguments.


0 commentaires

21
votes

Dans le cas de Cellation auto , auto est l'argument transmis au bloc. Avec simplement rendement , aucun argument n'est passé. auto n'est pas spécial ici, tout pourrait être cédé, par exemple xxx


4 commentaires

Et s'il y a plus d'un argument transmis au bloc? Est-ce que vous êtes un tableau d'entre eux?


Self 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 comme invocation de cette méthode. Le bloc {| x, y | x + y} est analogue à def fn (x, y) x + y extrémiser . Si vous avez appelé fn sans argument, fn () , vous vous attendez à x non défini dans le corps de la méthode, oui?



2
votes

penser au rendement comme appelez votre bloc et votre Self invoque votre bloc avec l'instance actuelle comme paramètre.


0 commentaires