2009-09-27 6 views
1
초기화 할 때 I은 미정 로컬 변수 나 메소드 에러에 직면하고

루비에서 다음루비 초기화 방법 키 해시 인스턴스 변수를 설정

제가

model = Model.new(1,2,:A) 
같은 클래스를 사용하고
class Model 
    attr_accessor :var1, :var2, :state 
    def initialize (x, y, key) 
    @var1 = x 
    @var2 = y 
    @state = every_state[:key] #this line produces the error 

    @every_state = { 
    :A => SateA.new, 
    :B => StateB.new, 
    :C => StateC.new, 
    :D => StateD.new 
    }  
    end 

    def select_state(key) 
    every_state[:key] 
    end 
end 

오류가 발생합니다 정의되지 않은 지역 변수 또는 메소드`every_state '

내가 자바 배경에서 오는 루비에 새로운 오전, 나는 승 hash()로부터 특정의 초기 상태를 선택하기 위해서, initialize 메소드에 열쇠를 건네 줄 수 있습니다 (here).

잘못된 방법으로 해시를 사용하고 있습니까? 아니면 초기화 메서드에서 완전히 제거하고 다른 메서드를 사용하여 설정해야합니까? 내 다른 생각은 내가 잘못 키에 대한 기호를 사용하고 있습니다.

또한 initialize 메서드 내에서 인스턴스 변수가 아닌 변수에 대해 작업하는 것이 직접적인 의미입니까? 예를 들어 초기화 내에서 해시를 인스턴스 변수로 선언하는 목적이 무엇인지 궁금합니다. ...

모든 아이디어를 환영합니다.

+0

들여 쓰기가 잘못되었습니다.'@ every_state'는'# initialize'에 정의되어 있으므로 같은 레벨에서 들여 쓰기해야합니다. 또한 호출하기 전에'@ every_state'를 초기화해야합니다 - 호출 전에 초기화를 이동하십시오 ('@state = ...') – hrnt

답변

1

이 구현은 Java 구현과 가장 가깝다고 생각합니다.

class Model 
    attr_accessor :var1, :var2, :state 

    def initialize (x, y, key) 
    @var1 = x 
    @var2 = y 
    @every_state = { 
     :A => SataeA.new, 
     :B => StateB.new, 
     :C => StateC.new, 
     :D => StateD.new 
    } 
    @state = select_state key 
    end 

    def select_state(key) 
    @every_state[key] 
    end 
end 
+0

그 덕분에 도움을 주셔서 감사합니다. 그러나 나는 여전히 ennuikiller의 발언에 대해 궁금합니다. Model.new를 호출 할 때마다 해쉬를 재정의하는 것을 피하는 방법은 무엇입니까? – denchr

+0

후자의 버전은 원래 Java 버전과 다릅니다.후자의 버전은 모든 인스턴스와 상태를 공유합니다 (인스턴스 X에서 상태 A를 수정하면 인스턴스 Y의 상태 A도 수정됩니다). – hrnt

+0

해시가 상수로 정의되었으므로 해시가 Model의 모든 인스턴스간에 공유됩니다. 각 모델은 전체 해시를 전달하며 인스턴스 변수 @state도 갖습니다. @state는 비즈니스 논리에 따라 선택적으로 해시 값을 사용합니다. 이 모델은 다른 모델 객체간에 달라야합니다. 맞습니까? 상태가 변경된 원래 상수 해시가 변경되면 변경 사항이 모든 모델 개체로 전파됩니다. 맞습니까? 따라서 "모든 상태로 상태를 공유"한다고 말하면 현재 모든 모델에서 일정한 해시를 공유하고 있다는 의미입니까? - 각각의 @state의 값은 아닙니다. – denchr

1

오타가 있습니다. : A => SateA.new는 다음과 같아야합니다. A => StateA.new. 또한 해시 정의를 initialize 메서드 밖에있는 최상위 수준에 배치합니다. 그렇지 않으면 새로 정의 된 모든 호출에서 재정의 할 것입니다. 원하는 작업을 원하지 않습니다!

+0

힌트를 보내 주셔서 감사합니다. I는 별도의 방법에서의 초기화 이외의 정의를 가지고 입력 : 데프 getStates을 available_states = { : A => SataeA.new, : B => StateB.new, : C => StateC.new, : D => StateD.new } end 해시 멤버를 매번 리디렉션하지 않습니까? 감사합니다 – denchr

+0

당신은 여전히 ​​틀린 상태를 철자하고 있습니다,'SataeA'는'StateA'이어야합니다. – Garrett

+0

이 수정되었습니다. 감사합니다 – denchr

2

"every_state"기능이 없습니다. 인스턴스 변수 @every_state 만 있습니다. 그래서 당신은 오류가 발생합니다.

모든 전화를 every_state으로 바꾸고 @every_state으로 바꾸십시오. 함수 또는 로컬 변수 every_state이 없습니다. 인스턴스 변수 @every_state 만 있습니다.