2012-12-23 4 views
3

(Ruby에서 작업 중) 먼저, 미리 사과드립니다. 나는 프로그래머가 아니기 때문에 편리함과 변화하는 세계로 간다. 필자가 프로그래밍에 참여하기 위해 필요한 것은 무엇이며, 다른 사람들이 내 프로그래밍을 위해 기다리는 것에 지쳐있었습니다. 따라서, 나는 그 동안의 기본 개념을 놓쳤다. 나는이 질문들을 할 때 때로는 결과에 의해 나 자신을 어리 석다.부모 클래스 초기화 된 변수를 자식 클래스의 인스턴스에 전달

클래스에서 종/직업 관계를 정의하고 싶다고합시다. 나는 슈퍼 클래스 "BlackAnt"를 정의하고 서브 클래스 "노동자", "파이터"와 "여왕"나에게

을 갖고 싶어, 직관적으로,이는 다음과 같이 보입니다 :

class BlackAnt 
    @legs = 6 
end 

class Worker < BlackAnt 
    @jaws = 'small' 
end 

을하지만 난 다음

을 시도하는 경우
ant1 = Worker.new 
puts ant1.legs 

오류가 발생했습니다. 내가 클래스 BlackAnt을 개정하는 경우에 :

class BlackAnt 
    attr_accessor :legs 
    @legs = 6 
end 

ant1.legs 반환 '전무'나는 방법이 여기에 설명하려고했습니다

: http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

을하고이 돌아 Worker.legs 수 '6' 하지만 ... 아아 :

ant1 = Worker.new 
Worker.legs => '6' 
ant1.legs => 'nil' 

추측에, 그 부모 변수의 값은 새로운 아이가 양산 될 때마다 초기화되지 않습니다.

나는 어쩐지 이것에 대해 어리 석음을 느낍니다. 그리고 그 대답은 의심 할 여지없이 카페인에 이끌려 모든 밤을 발견 한 날을 저주하게 만들 것입니다.

ant1 = Worker.new 
ant2 = Queen.new 
ant3 = Fighter.new 

을하고 각각의 하위 클래스에 할당 된 특별한 어떤 특성과 함께, 다리의 적절한 양을 취득해야 : 내가 뭘해야 내가 그렇게 같은 객체를 생성 할 수 있도록 일을 준비합니다. 작업자/퀸/전투기 분류는 실제 통화가 될 것입니다 있도록 네임 스페이스에 구속됩니다

ant1 = AntBlack::Worker.new 
ant2 = AntRed::Worker.new 
ant3 = AntRed::Queen.new 

그때 개인의 다리의 양을 확인할 수 있도록하고 싶습니다

개미 사용 : 내 엄지 손가락에 도착하기 위해 내 팔꿈치 주위에 갈 수

ant1.legs #=> 6 

. 그렇다면 동일한 결과를 달성 할 수있는 방법에 대한 제안을 자유롭게 주시면 통찰력을 높이 평가하겠습니다.

/// 업데이트 재 : 응답 ///

class AntRed 
    attr_accessor :legs 
    def initialize 
    @legs = 6 
    end 
end 

class Worker < AntRed 
    @strength = 1 
end 

결과 :

irb(main):009:0> ant1 = Worker.new 
#=> #<Worker:0x87616ac @strength=1> 
irb(main):010:0> ant1.legs 
#=> nil 

답변

4

다음과 같이 BlackAnt 클래스를 정의 :

class BlackAnt 
    attr_accessor :legs 

    def initialize 
    @legs = 6 
    end 
end 

그리고 당신의 노동자 클래스를 다음과 같이 :

class Worker < BlackAnt 
    attr_accessor :strength 

    def initialize 
    super 

    @strength = 1 
    end 
end 

현재 BlackAnt 클래스를 정의하는 방식으로 다리를 class level instance variable으로 저장하고 있습니다.

+0

감사를 회신 -이 없습니다, 그러나, 해상도 것으로 보인다. 여기에 코드 블록을 넣을 수 없으므로 그에 따라 질문을 편집 할 것입니다. –

+0

Worker 클래스에도 initialize 메서드를 추가 한 경우 super를 호출해야합니다. 나는 그 문제에 대해 내가 의미하는 것을 보여주기 위해 나의 대답을 편집했다. – cbascom

+2

지금은 초기화되지 않고 초기화 된 상태입니다. 나는 초기화되지 않은 버전이 왜 작동하지 않는지 궁금해지기를 너무 피곤하다. (내가 다시로드하기 전에 Ctrl + S를 누르는 것을 잊어 버린 5 달러), 나는 너에게 무언가를 깊이 고맙게 생각하고 술 취한 하마처럼 잠들 것이다. . –

0

그 부모 변수의 값은 새 자식이 생성 될 때마다 으로 초기화되지 않습니다.

루비 인스턴스 변수는 단일 개체에 속합니다.

를 해결하기 위해 시작하는 내 대답에 점 7) 봐 당신이 irb(main):010:0> ant1.legs #=> nil을받을 이유가 이해가 안

Why are symbols in Ruby not thought of as a type of variable?


에서 "그들이 변수는 사실이". 나를 위해 그것은 (적어도 스크립트로) 작동합니다.

class AntRed 
    attr_accessor :legs 
    def initialize 
    @legs = 6 
    end 
end 

class Worker < AntRed 
end 

ant1 = Worker.new 
print 'ant1.legs : '; puts ant1.legs 

실행 :

$ ruby -w test.rb 
ant1.legs : 6 
0

당신은 당신이 이니셜 된 클래스의 인스턴스 varieble를 원하는 뜻!

그래서 당신은 이런 식으로 작업을 수행 할 수 있습니다

class BlackAnt 
    attr_accessor :legs 
    @legs = 6 

    def initialize 
    @legs = self.class.instance_variable_get(:@legs) 
    end 
end 

newObj = BlackAnt.new 
newObj.legs 
+0

그것은 추한 방법이라고 생각합니다. – user1933562

관련 문제