2011-10-06 4 views
1

변수가 nil 대신 초기화되지 않으면 다른 것을 반환하려고한다고 말하십시오. 이것이 가능한가? 클래스별로 오버로드하고 싶습니다.Ruby에서 인스턴스 변수 조회를 무시할 수 있습니까?

(이유는 주로 미친 속임수로 놀기 때문입니다).

+1

가능한 복제본 : [Ruby에는 정의되지 않은 인스턴스 변수에 대해 method_missing equivalent가 있습니까?] (http://stackoverflow.com/questions/7651213/does-ruby-have-a-method-missing-equivalent-for-undefined- 인스턴스 변수) – rdvdijk

+0

프로덕션 환경에서 이것을 사용할 계획이 없습니다. –

답변

0

당신이 경우 래퍼 방법을

def something 
    @var || "your default" 
end 
+0

가능하다면 인스턴스 변수 조회 (자동 조회, 할당은 중요하지 않습니다) –

+0

에 대해 자동으로 수행하고 싶습니다. 사용 중이어야합니다 @ setter가 아니야 –

1

을 쓸 수, 당신은 #instance_variable_defined?#instance_variable_get를 사용할 수 있습니다. 예를 들어 :

class Thing 
    def method_missing(method, *args, &block) 
    ivar_name = "@#{method}".intern 

    if instance_variable_defined? ivar_name 
     instance_variable_get ivar_name 
    else 
     super method, *args, &block 
    end 
    end 
end 

자동으로 설정 인스턴스 변수에 대한 예 변수 독자를 정의하거나 것이다 다음 IVARS 일정에 명명 된 인스턴스 변수가 기본값으로 디폴트 경우

class Thing 
    IVARS = [:@first, :@second] 

    def method_missing(method, *args, &block) 
    ivar_name = "@#{method}".intern 

    if IVARS.include? ivar_name 
     if instance_variable_defined? ivar_name 
     instance_variable_get ivar_name 
     else 
     "your default" 
     end 
    else 
     super method, *args, &block 
    end 
    end 
end 

어떤을 위해 독자를 정의 할 값. 인스턴스 변수 이름을 해쉬 매핑 값으로 변경하는 방법을 알 수있을 것입니다.

또는이보다 더 많은 유연성이 필요하지 않은 경우 당신은 단순히 디폴트 값을 제공하기 위해 instance_variable_get을 사용할 수 독자 방법을 정의하지 않을이 비록

thing = Thing.new 
thing.instance_variable_get :@ivar_name, "your default" 

을 - 당신은 instance_variable_get 각을 통해 접근해야 할 것입니다 시각.

+0

내가보고있는 동작은 정의되지 않은 속성에 액세스하려고 시도 할 때 method_missing이 호출되지 않는다는 것이며, 가로 채지 않고 Nil로 직접 평가하는 것입니다. 내가 놓친 게 있니? –

관련 문제