0

Je vais par Michael Hartl de rails tutorial et sont venus à un point où il définit un attribut virtuel, remember_token et attribue plus tard une valeur dans une méthode d'instance remember:Comment les attributs virtuels sont-ils gérés en mémoire?

class User < ApplicationRecord 
    attr_accessor :remember_token 
    ... 

    def remember 
    self.remember_token = User.new_token 
    update_attribute(:remember_digest, User.digest(remember_token)) 
    end 
end 

Il accède ensuite à la valeur de l'attribut virtuel dans une méthode d'assistance après remember est appelé:

def remember(user) 
    user.remember 
    cookies.permanent.signed[:user_id] = user.id 
    cookies.permanent[:remember_token] = user.remember_token 
end 

Mon interprétation est que, après la méthode remember est exécutée (et où remember_token est attribué, il est retiré de Mémoire. Évidemment, ce n'est pas le cas ici car il est toujours disponible lors de l'attribution d'une nouvelle valeur à cookies.permanent[:remember_token]. Je suppose que ma source de confusion provient de la persistance des données. En supposant que le remember_token est transformé en variable d'instance à l'aide de attr_accessor, quand devient-il officiellement indisponible?

+1

Lorsque l'objet disparaît. Les méthodes d'instance ne deviennent jamais indisponibles, elles font partie de l'objet sur lequel elles sont définies. – meagar

+0

Je suis désolé. Peut-être pas les * méthodes d'instance * en soi mais la valeur que la méthode d'instance produit. –

+0

Ces valeurs sont récupérées comme n'importe quelle autre valeur. Tant qu'il y a une référence à eux, ils ne seront pas supprimés. – meagar

Répondre

0

Votre hypothèse est fausse. "Attributs virtuels" est un terme utilisé pour les anciens attributs d'instance simples dans les modèles afin de les différencier des attributs sauvegardés de la base de données. Les attributs d'instance conservent leur valeur tant que l'objet qui les encapsule existe (ou que vous avez explicitement ignoré la valeur). L'objet existe jusqu'au ramasse-miettes can determine that it is no longer referenced.

class Person 
    attr_accessor :name 

    def initialize(name: nil) 
    @name = name 
    # or using the accessor 
    self.name = name 
    end 
end 

Donc, si nous créons une instance de Person il de conserver bien sûr la valeur de name:

jane = Person.new(name: 'Jane') 
jane.name # => 'Jane' 

Ce que vous pourriez être source de confusion est des variables locales qui ne sont disponibles que dans le bloc où ils sont défini:

class Person 
    attr_accessor :name 

    def say_hello 
    # this local variable is garbage collect after the method is called 
    phrase = "Hello, my name is " 
    puts phrase + name # we can omit self since it is implied 
    end 
end 
+0

"Supposer que le song_token est transformé en variable d'instance à l'aide de attr_accessor" est également faux - attr_accessor crée une méthode setter et getter par méta-programmation. Il ne déclare pas les variables d'instance. La variable d'instance est créée chaque fois qu'une valeur lui est affectée. – max

+0

Merci pour la réponse détaillée. Je dois demander si vous vouliez dire "nom" au lieu de "barre" dans votre explication? –

+0

Oops oui Je voulais dire le nom. – max