2012-03-03 5 views
6

Ruby에서 인스턴스 변수를 이해하려고 할 때 약간 미쳤다고 생각합니다. 내 유일한 목적은 해당 클래스에 대해 생성 된 모든 객체가 이 아닌 변수를 가지며이 해당 클래스에 대해 initialize 메서드를 작성하지 않고 수행되도록하는 것입니다. 같은 뭔가 :Ruby에서 인스턴스 변수 초기화

class Test 

    @my = [] 

    attr_accessor :my 

end 
t = Test.new 
t.my # I want [] but this shows nil 

그것은 initialize을 건드리지 않고 이것을 달성 할 수 있습니까? 감사.

편집 :가 명확히하기 위해, 나는 그것을 실행하는 클래스에 인스턴스 변수를 추가 할 것입니다 의미에서 attr_accessor 유사한 실행하는 코드의 일부 조각을 쓰고 있어요. 내 자신의 initialize을 작성하면 사용자가 작성한 것을 clawbering하는 것입니다.

답변

11

당신이하고있는 일은 클래스 수준에서 인스턴스 변수를 정의하는 것입니다 (클래스는 Class 클래스의 인스턴스이므로이 함수는 잘 작동합니다).

아니요, 초기화 할 방법이 없습니다.

편집 : 편집에 약간의 오해가 있습니다. attr_accessor은 인스턴스 변수를 클래스에 추가하지 않습니다. 그것은 무엇을 말 그대로,이 (my 당신의 예를 사용하여) : 그것은 적극적으로 생성/인스턴스 변수를 초기화하지 않습니다

def my; @my; end 
def my=(value); @my = value; end 

을, 그냥 두 가지 방법을 정의합니다. 그리고 define_method을 사용하여 비슷한 일을하는 클래스 메서드를 작성할 수 있습니다.

편집 2 :

더 하나가 이러한 방법 쓰기 얼마나 설명하기 :

class Module 
    def array_attr_accessor(name) 
    define_method(name) do 
     if instance_variable_defined?("@#{name}") 
     instance_variable_get("@#{name}") 
     else 
     instance_variable_set("@#{name}", []) 
     end 
    end 

    define_method("#{name}=") do |val| 
     instance_variable_set("@#{name}", val) 
    end 
    end 
end 


class Test 
    array_attr_accessor :my 
end 

t = Test.new 
t.my # => [] 
t.my = [1,2,3] 
t.my # => [1, 2, 3] 
+0

편집을 참조하십시오. – sasuke

+0

나의 나쁜, 나는 "유사하다"고 말했다. 기본적으로,이 새로운 메소드는'attr_accessor'와 같은 어떤 클래스에 추가 될 때, 그 클래스를 위해 생성 된 모든 객체에 새로운 인스턴스 변수를 추가 할 것입니다. – sasuke

+1

아, 내가 생각하기에, 나는 그러한 속성들에 대해 디폴트'attr_reader'에 의지 할 수 없다. 한가지 마지막 질문 : Ruby에서 Java와 같은 방식으로 인스턴스 변수를 초기화 할 방법이 없습니까? – sasuke

0

내가 왜 당신에게 그냥 빨리 초기화를 쓰기 때문에 주저하고, 그것을 생각하지 않습니다를 방법?

2
# as instance variable without initialize 
class Test1 
    def my; @my ||= [] end 

    attr_writer :my 
end 

t = Test1.new 
t.my 


# as class instance variable 
class Test2 
    @my = [] 

    class << self; attr_accessor :my end 
end 

Test2.my 
+1

+1, 특히 접근자를 가진 클래스 수준 변수. 'initialize '가없는 인스턴스 변수는't.my = nil'을 설정하려고하면'|| ='로 인해't.my'가'[]'로 되돌아갑니다. 이것은 예상치 못한 결과 일 수 있습니다. 원한다. '초기화 '를 피하지 않는 것이 좋습니다. – mklement0

관련 문제