2012-08-02 2 views
0

루비 1.9Ruby의 인스턴스 변수

루비에서 인스턴스 변수를 정의하고 초기화하는 방법을 알지 못한다는 것을 알게되었습니다. 내에서만 특정 class 내에서 액세스 할 수 없으므로 클래스 외부에서 액세스 할 수 없으므로 attr_accessor 또는 attr_reader은 내가 필요한 것이 아닙니다.

class MyClass 

    #how do I initialize it? 
    @my_var = 'some value' 

    def method1 
    #I need to do something with @my_var 
    puts @my_var 
    end 
    def method2 
    #I need to do something with @my_var 
    puts @my_var 
    end 
end 

a = MyClass.new 
a.method1 #empty 
a.method2 #empty 

그래서 나는 두 번째 올바른 접근하고, 그것을

class MyClass 

    #is this the only way to do it? 
    def initialize 
    @my_var = 555 
    end 

    def method1 
    #I need to do something with @my_var 
    puts @my_var 
    end 

    def method2 
    #I need to do something with @my_var 
    puts @my_var 
    end 
end 

a = MyClass.new 
a.method1 #555; it's ok 
a.method2 #555; it's ok 

잘 할 수있는 또 다른 방법이 있다는 것을 발견? 각 클래스는 다른 언어의 생성자와 유사한 역할을하는 initialize() 방법이있다

답변

3

, 인스턴스 변수가 초기화 할 필요가

class MyClass 

    def initialize 
    @my_var = 'some value' 
    end 

    # etc... 
end 
+0

' 초기화()'? 내 질문이야. – Alexandre

+0

모든 인스턴스 메소드에서 초기화 될 수 있지만 '초기화'는 주어진 인스턴스에 대해 호출되는 첫 번째 메소드이므로 수행하는 것이 가장 좋습니다. – tadman

+0

어떤 방법으로 초기화 할 수없는 이유는 무엇입니까? 'class MyClass @my_var = 'some value'; end'? – Alexandre

2

예, initialize 올바른 방법입니다.

하지만 당신도 할 수 있습니다

method1 처음이라고
class MyClass 

    def method1 
    #I need to do something with @my_var 
    puts @my_var ||= 555 
    end 

    def method2=(x) 
    #I need to do something with @my_var 
    puts @my_var = x 
    end 
end 

#Test: 
x = MyClass.new 
x.method1  #555 
x.method2= 44 #44 
x.method1  #44 

,이 변수를 초기화합니다.

편집 : 당신이 nil

x = MyClass.new 
x.method1   #555 
x.method2= nil #nil 
x.method1   #again 555 

이 버전은 작동을 할당 할 때 그것은 예상대로 작동하지 않습니다 더 나은 :

그들은 유일한 방법 (생성자)에 초기화 할 수 있습니다
class MyClass 

    def method1 
    @my_var = 555 unless defined? @my_var 
    puts @my_var 
    end 

    def method2=(x) 
    puts @my_var = x 
    end 
end 

x = MyClass.new 
x.method1   #555 
x.method2= nil #nil 
x.method1   #keeps nil 
+0

이것은 게으른 정의 패턴입니다. – tadman