2011-03-11 2 views
5

Ruby on Rails 3을 사용하고 있으며 어떤 상황에서 다른 변수 유형 대신 인스턴스 변수를 사용해야하는지, 보안상의 이유가 있는지 알고 싶습니다.어떤 상황에서 다른 변수 유형 대신 인스턴스 변수를 사용해야합니까?

예 : 로컬 변수 만 로컬 및 기능/개체/블록 범위 안에 유지하는 반면 인스턴스 변수는 로컬 및 개체의 인스턴스 안에 유지 일반적

# Using an instance variable 
@accounts = Account.find(...) 

# Using a "local"\"normal" variable 
account = Account.find(...) 
+0

클래스 변수는'@@ accounts'와 같습니다. '@ accounts'는 인스턴스 변수입니다. –

+0

첫 번째 예제는 클래스 변수가 아닌 인스턴스 변수입니다. 두 번째 변수는 지역 변수입니다. 컨트롤러, 모델 또는 일반적인 Ruby 클래스를 특별히 언급하고 있습니까? –

+0

@ LBG, @Pan Thomakos - 죄송합니다, 제 실수였습니다. 변덕스러운 문제에 대해서는 전문가가 아닙니다. – user502052

답변

9

. 예를 들어 다음 인사 기능 name에서

class User 
    def name 
    @name 
    end 

    def name= name 
    @name = name 
    end 
end 

def greet user 
    name = user.name || 'John' 
    p "Hi, my name is #{name}" 
end 

user = User.new 
greet user 
=> 'Hi, my name is John' 
name 
=> NameError: undefined local variable or method 'name' for main:Object 
user.name = "Mike" 
greet user 
=> 'Hi, my name is Mike' 
@name 
=> nil 

는 해당 함수에 정의하는 로컬 변수이다. name 변수는 함수의 첫 번째 줄, name = user.name || 'John'에 설정되지만 해당 값은 함수 외부에서 유지되지 않습니다. name을 호출하면 greet 함수 내에서만 이름이 로컬 변수로 정의 되었기 때문에 NameError이 표시됩니다.

@name은 User 클래스의 사용자 인스턴스에 로컬합니다. 그 컨텍스트 외부에서 호출하려고하면 nil이됩니다. 로컬 변수와 인스턴스 변수의 차이점 중 하나는 인스턴스 변수가 정의되지 않은 경우 nil을 반환하는 반면 로컬 비 인스턴스 변수는 Error를 발생시킵니다.

두 변수 유형 모두 특정 컨텍스트에 대해 로컬임을 알 수 있습니다. @name은 사용자 인스턴스 내에 정의되어 있으므로 user.name을 호출하면 @name이 정의 된 사용자 인스턴스에서 name 함수가 호출됩니다. name은 greet 함수에만 정의되어 있으므로 p "Hi, my name is #{name}"을 호출하면 정의 된 범위 내에 있으므로 name의 값을 가져올 수 있습니다.

+0

@ Davy8이 나를 대답했습니다. – user502052

+2

getter 메서드에서 단순히 지역 변수 이름 대신 @name을 사용하는 이유를 설명 할 수 있습니까? 인스턴스 변수와 로컬 변수가 모두 상황에 따라 유효하기 때문에 두 변수를 구분해야하는 이유는 무엇입니까? –

9

@ 팬의 대답은 그들 사이의 차이점에 대한 좋은 설명을 제공합니다.

일반적으로 (거의 모든 언어로) 필요한 최소의 범위에서 변수를 정의하려고합니다. 따라서 함수 호출을 통해 유지되어야하는 것이 필요하지 않으면 로컬로 만듭니다.

특정 클래스 인스턴스에 대해서만 변수를 유지해야하는 경우이를 인스턴스 변수로 지정하십시오.

그 클래스의 모든 인스턴스간에 공유해야하는 것이 있으면 클래스 변수를 사용해야하지만이 필요성은 다소 희귀해야하므로 클래스 변수가 필요한지 신중하게 생각하십시오.

(면책 조항 : 나는 약 2 주 동안 Ruby와 만 놀았 기 때문에 대부분이 언어에 대한 불가지론 답변이지만 Ruby에 적용된다고 확신한다.)

관련 문제