0

私はマイケル・ハートルのrails tutorialを通じてつもりだと彼は仮想属性を定義するポイントになってきた、remember_token以降rememberインスタンスメソッドでそれに値を代入します。仮想属性はどのようにメモリ内で管理されますか?

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 

彼は、その後の値にアクセスしますremember後のヘルパーメソッドにおける仮想属性が呼び出されます。

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

私の解釈がrememberメソッドの後に実行される(とremember_tokenが割り当てられている場合、それはから削除されますということでしたメモリ。明らかに、これは新しい値をcookies.permanent[:remember_token]に割り当てるときに使用できるので、ここでは当てはまりません。

私の混乱の原因は、データの永続性に起因すると思います。 remember_tokenattr_accessorの助けを借りてインスタンス変数にすると仮定すると、いつ正式に利用できなくなるのでしょうか?

+1

オブジェクトが離れるとき。インスタンスメソッドは決して「利用不可能」になることはなく、定義されているオブジェクトの一部です。 – meagar

+0

すみません。たぶん*インスタンスメソッド*自体ではなく、インスタンスメソッドが生成する値かもしれません。 –

+0

これらの値は、他の値と同様にガベージコレクトされます。それらへの参照がある限り、それらは削除されません。 – meagar

答えて

0

あなたの前提は間違っています。

"仮想属性"は、実際には、永続化されているデータベースバックアップ属性と区別するために、モデルの一般的な古いインスタンス属性に使用される単なる用語です。

インスタンス属性は、それらをカプセル化するオブジェクトが存在するかぎり、値を保持します(または明示的に値を指定しないでください)。オブジェクトは、ガベージコレクタ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 

我々はPersonのインスタンスを作成するのであれば、それは当然のことながらnameの値を保持します:あなたは混乱するかもしれない何

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

は、彼らがしているブロックにのみ使用できますローカル変数であります定義:

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

"remember_tokenがattr_accessorの助けを借りてインスタンス変数になったと仮定すると"間違っています - attr_accessorはメタプログラミングによってセッターとゲッターメソッドを作成します。インスタンス変数は宣言しません。インスタンス変数は、値が割り当てられるたびに作成されます。 – max

+0

詳細な回答ありがとうございます。私は尋ねなければならない、あなたの説明に 'bar'の代わりに' name'を入れることを意味しましたか? –

+0

おっと私は名前を意味しました。 – max

関連する問題