2014-02-11 3 views
1

인스턴스 변수를 직접 참조하고 동일한 인스턴스 변수를 반환하는 메서드를 호출하는 것의 차이점에 대해 궁금합니다. 인스턴스 변수 대 지연로드 방법

은 우리가 다음 블록을 보자 :

def some_method 
    return @var if @var.present? 
    ... 
end 

기능이 많다는 @var를 참조하고 some_method를 호출 차이가 없다. 둘 다 동일한 값을 반환합니다 (우리가 같은 인스턴스에 있다고 가정).

def yet_another_method 
    var = some_method 
end 

어떻게 이러한 접근 방식이 서로 다를 않습니다 똑같이

def another_method 
    var = @var 
end 

작동합니다? 마지막 것이 더 좋을 때?

+1

'@ var'을 호출 할 수 없습니다. 당신은'instance_variable_get : @ var'을 호출해야합니다. –

+1

* "calling @var"*는 무엇을 의미합니까? 예를 든다. – Agis

+0

2 명이 질문에 답변했을 때 어떻게 알 수 있습니까? –

답변

1

정확히 인스턴스 변수를 얻고 싶지 않을 때 메소드에서 인스턴스 변수를 래핑합니다. 예를 들어, 당신이 원하는 경우 오히려 당신이 방법에 넣어 및

def foo; @foo ||= ... end 
foo ... 

또는 그것을 호출 할 필요가 대신

@foo 

를 호출 한 후, memoize하는 당신이 아닌 다른 값을 반환하려는 경우 변수가 특정 값을 취하면 변수, 당신은이

def foo 
    if @foo == ... then ... else @foo end 
end 
foo ... 
+0

나는'def foo; @foo || = ... end'는 적어도 하나의 인자 (이 경우 setter)를 취하는 메소드로 더 의미가 있습니다. def foo arg1; @foo || = arg1 end' –

+0

@ DarekNędza 만약 세터라면, 메모 작성이 필요 없습니다. – sawa

0

@bonus 방법에 싸여있는 상태를 둘 필요가, 당신은 변경할 수있는 bonus 자신의 방법을 구현하는 것을 의미합니다. 이렇게하면 코드를 쉽게 구성 할 수 있도록 구성 할 수 있으며 데이터가 아닌 동작에 의존 할 수 있습니다.

class Pay 
    attr_accessor :bonus 

    def initialize(b) 
    @bonus = b 
    end 

    def bonus 
    @bonus = 100 if @bonus > 100  
    end 
end