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

귀하의 가정이 잘못되었습니다.

"가상 속성"은 실제로 모델에서 일반적인 오래된 인스턴스 속성에 사용되는 용어로, 지속되는 데이터베이스 기반 특성과 구별됩니다.

인스턴스 속성은 해당 속성을 캡슐화하는 객체가 존재하거나 값을 명시 적으로 nil하는 경우 해당 값을 유지합니다. 개체는 가비지 컬렉터 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는 메타 프로그래밍을 통해 setter 및 getter 메소드를 만듭니다. 인스턴스 변수는 선언하지 않습니다. 인스턴스 변수는 값이 할당 될 때마다 만들어집니다. – max

+0

자세한 답변을 보내 주셔서 감사합니다. 나는 당신의 설명에'bar' 대신'name'을 넣으려고 했습니까? –

+0

죄송합니다. 예. 이름을 의미했습니다. – max