2015-01-07 2 views
0

루비 객체 내부를 탐색하는 것은 아주 간단합니다. 다음 의사 코드 감안할 때, 예를 입력으로이 단락을 사용하여 다음 호출은 의미가 및 작동 :루비 객체 위로 이동

forth_word = Par.sentence[0].word[3] 
puts forth_word.text #"ruby" 
puts forth_word.type #:noun 

의사 서로에 포함 된 클래스의 코드 : 중첩의 (일종의하지만 엄격한 OOP의 의미)

class Paragraph 
    @page_number = #1 (default) 
    @sentences = [] 
end 

class Sentence 
    @is_a_quote = #false (default) 
    @words = [] 
end 

class Word 
    @text =# "ruby" 
    @type =# :noun 

    def in_a_quote? 
    #... return [email protected]_a_quote 
    end 

    def on_page 
    #... return Paragraph.Sentence.page 
    end 
end 

나는 일명 문장이나 단락 객체에 속하는 내부의 말씀에서 정보에서 물어 ... 루비 객체 트리를 탐색하려고 할 때 까다로운 부분이됩니다. 내가 마지막으로이 방법을 코딩 할 수있는 방법을 어떤 제안은 :.

puts forth_word.in_a_quote #false 
puts forth_word.on_page  #1 
+1

이 유형의 데이터 구조는 요구 사항에 적합하지 않습니다. sql에 데이터를 저장하고 ORM을 사용하여 데이터를 구상합니다. –

+3

"sudo"를 "pseudo"로 변경하십시오. 나를 미치게하고있어. 또한'Sentence'와'Word'가 중첩되도록하려면'class Sentence

+0

@CarySwoveland : Omigod, 당신은 천재입니다. 나는 수퍼 유저 권한으로 무엇을해야하는지 알아 내려고 벽에 머리를 세우고 있었다.하지만 OP는 계층 구조 (is-a)가 아니라 포함 (has- a, 인스턴스 변수에서), 올바른 일입니다 :'Word'는 분명히'Sentence'의 타입이 아니며'Sentence'는'Paragraph'의 일종입니다. – Amadan

답변

2

각 단어는에있는 문장을 가리키는 문장 변수가 문장과 Paragraph- 및 단락 및 페이지에 대한 동일 할 수 있습니다.

+0

감사! 이것은 직선적 인 해결책처럼 보입니다 (나는 왜 그것을 생각하지 못했는지). 나의 유일한 반대는 그것이 매우 건조한 것 같지 않다는 것입니다. 내가 만드는 모든 클래스에 대해 '부모'클래스에 자리 표시자를 넣는 것을 잊지 않았습니다. 어쩌면 이것은 OOP가 어떻게 디자인 되었는가에 대한 유일한 해결책 일 수도 있지만 네이티브 메소드가있을 거라고 생각했습니다. 웹 페이지 DOM 트리 또는 XML 문서를 탐색하는 것과 비슷합니다. 파서가 설명하는대로 포인터를 사용하는지 또는 다른 마술을 사용하는지 확실하지 않습니다. – Nathan

+0

Ruby 변수는 기본적으로 참조로 전달되므로 포인터가 될 가능성이 큽니다 (확실하지는 않습니다). 반복되는 코드가 없기 때문에 내 솔루션이 건조하다고 생각합니다. – Dbz

0

우선, 클래스는 중첩되지 않습니다. 그들은 서로 선언해야합니다.

class Paragraph 
    @page_number = #1 (default) 
    @sentences = [] 

    class Sentence 
     @is_a_quote = #false (default) 
     @words = [] 

     class Word 
      @text =# "ruby" 
      @type =# :noun 
     end 
    end 
end 

하지만 Ruby의 Java와 달리 내부 클래스의 외부 클래스 변수에는 액세스 할 수 없습니다. Ruby Constants and Nested Classes 그리고 중첩 클래스보다 모듈을 사용하는 것이 좋습니다.

그러나 예와 같이 동일한 계층 구조를 계속 사용하려면 클래스 외부에있는 데이터에 액세스해야합니다. 당신이 코드

class Word 
    @text =# "ruby" 
    @type =# :noun 

    def in_a_quote? 
    #... return [email protected]_a_quote 
    end 
end 

w = Word.new 
w.is_a_quote? 

이것은 매우 위험하고 OOP 원칙에 모순이 조각을 실행하려고하면 예를 들어, 오류가 발생합니다.

+0

'중첩 된'이 적절한 용어는 아니지만 설명하는 방법이 확실하지 않다는 것에 동의합니다. 왜 이것이 위험한 것이며 그것을 위반하는 원칙을 설명 할 수 있습니까? – Nathan

+0

Word.is_a_quote 메서드가 가정에 의존하기 때문에 위험합니다. Sentence 클래스의 일부 개체가 있고 @is_a_quote 매개 변수가 있습니다. 그러나이 메소드가 Sentence 클래스에서 @is_a_quote를 삭제하거나 간단히 대답 할 때 작성한 코드를 실행하려고하면 어떻게됩니까? 캡슐화가 완전히 위반되었습니다. 'is_a_quote? 가장 논리적 인 장소에서 Sentence 클래스에서 선언해야합니다. –