2015-01-07 44 views
0

在紅寶石對象內導航非常簡單。考慮下面的僞代碼,並利用這一段爲例輸入,下面的調用有意義,工作原理:導航Ruby對象

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 

,當我嘗試向上導航Ruby對象樹...又名詢問從裏面的Word屬於句子或段落對象的信息最棘手的部分就越大。任何建議,我怎麼能代碼的最後2種方法:

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」類型,也不是「Paragraph」類型的「Sentence」。 – Amadan

回答

2

每一個字可以有指向句子是在一個句子中的變量相同的句子和中─和段落和頁面。

+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類中聲明它。 –