1

아래 샘플 클래스가 있습니다.루비의 이전 입력 값을 기억하십시오.

class MyClass 
    def initialize(options = {}) 
    @input = options[:input] 
    end 

    def trigger 
    # I want to remember previous input value if this method called. 
    input 
    end 
end 

이전에 입력 한 이전 값을 저장하거나 기억할 수 있습니까? 예를 들어.

my_class = MyClass.new(input: "first") 
my_class.trigger 
=> first 

나는 호출하는 경우 :

my_class.input = "second" 

내가 "fisrt"입니다 이전 값 입력을 기억합니다. 이것을 어떻게 할 수 있습니까?

+1

, 당신은 전과가 변경된 후 개체의 이전 상태를 기억합니다 ActiveModel :: 더러운를 포함 할 수 있습니다. – bkunzi01

+0

감사합니다. @ bkunzi01. 이것은 또한 유용합니다. – araratan

답변

1

당신은 당신이 방법 트리거를 호출 할 때 input 변수에 할당 된 값을 유지하기 위해 다른 인스턴스 변수가 필요합니다.

당신이 태그와 레일을 추가하기 때문에
class MyClass 
    attr_writer :input 

    def initialize(options = {}) 
    @input = options[:input] 
    end 

    def trigger 
    @triggered_input = @input 
    end 

    def input 
    @triggered_input 
    end 
end 

my_class = MyClass.new(input: 'first') 
my_class.input #=> nil 
my_class.trigger #=> 'first' 

my_class.input = 'second' 
my_class.input #=> 'first' 
my_class.trigger #=> 'second' 
my_class.input #=> 'second' 
+0

'attr_accessor'를 사용하고 reader와 writer 메소드를 모두 사용하지 않는 이유는 무엇입니까? – tadman

+1

getter 메서드에서 다른 값을 반환하기 때문에이 경우에는'attr_accessor : input'을 사용할 수 없습니다. –

+0

아, 그렇다면 당신 말이 맞아요. 이것의 디자인은 혼란 스럽지만 그것이 그것이 문제가되는 방법입니다. – tadman

1

당신이해야 할 일은 @input as와 array를 만들고 그 위에 반복하여 모든 결과를 표시하는 것입니다.

class MyClass 
    attr_accessor :input 

    def initialize(options = {}) 
    @input = [] 
    @input << options[:input] 
    end 

    def input=(item) 
    @input.unshift(item) 
    end 

    def trigger 
    # I want to remember previous input value if this method called. 
    @input.first 
    end 
end 

my_class = MyClass.new(input: 'first') 
my_class.input = "second" 

my_class.input.each {|i| puts i} 
+1

'@ input.unshift (options [: input])'을하고 나중에 트리거를'@input [1]'로 정의 할 수 있습니다. – tadman

+0

네, 그 점을 봅니다. –

+0

감사! @CototStifeVII. 이 방법이 효과적이지만 위의 대답을 수락 했으므로 나는 당신의 대답을 그냥 상상 만 할 것입니다. – araratan