2017-10-22 2 views
0

롤백 역할을하는 클래스를 생성해야합니다. 난 데롤백 클래스 만들기 - Ruby

class Rollbacker 
def perform(*args, &block) 
    begin 
    objCopy, @originalState = args 

    objCopy.each do |i| 
     i.instance_eval(&block) 
    end 
    rescue 
    objCopy = @originalState //Here i tried also with args = originalState 
    raise 
    end 
end 

문제는 (블록이 인수와 잘 실행) 잘 작동 "수행"고하지만, 구조가 발생 (에러가 발생) 할 때, 내가 인수가 반환 필요도가 원래 상태입니다 "시작"의 변화는 없지만 일어나지는 않습니다.

(가) 내가 인수의 복사 작업 후 구조에 변화거야 "시작", 그런데 왜 무엇에

어떤 생각을 작동하지 모르는에 내가 틀리지 않는 경우 변화?

+0

루비 강하게 그래서'objCopy'는'obj_copy'해야, 변수와 메소드 이름을 명명 밑줄 스타일로 모든 소문자를 권장합니다. 이는 대문자가'ClassName'이나'CONSTANT_NAME'과 같은 상수를 나타 내기 위해 사용되기 때문입니다. – tadman

+0

이 코드를 어떻게 사용하고 있습니까? 그것이 채용되는 방식은 완전히 명확하지 않습니다. 예외를 던지게하는 간단한 예제와 그렇지 않은 간단한 예제를 함께 사용하면 무엇이 잘못되었는지 설명하는 것이 더 쉬울 것입니다. – tadman

+0

만약 당신이'args'를 돌연변이한다면'clone'을 사용하여 그것을 보존하고 구조 블록에서 _that_를 사용하십시오. – Anthony

답변

-1

이 예는 클래스 클라스을 갖는 것 :

class Klass 
attr_accessor :counter 

def initialize(c) 
    @counter= c 
end 

def plus 
    self.counter = self.counter+ 1 
end 
end 
--------------------------- 

rollbacker.perform(Klass.new(0)) {|k| k.plus} //this leaves the counter in 1. Currently working fine 

--------------------------- 
k = Klass.new(0) 
def kaboom(k) 
    tr.perform(k) {|k| 
    k.plus 
    raise 'Kaboom!'} 
end     //This should raise the error (which it does), but the counter should stay on 0; but at the moment it stays in 1 (the plus happens, but not rollback is happening) 
+0

질문을 편집하여 자세한 내용을 추가하십시오. 이것은 답이 아닙니다. – henrebotha