向上导航Ruby对象

向上导航Ruby对象,ruby,oop,Ruby,Oop,在ruby对象中向下导航非常简单。给定以下伪代码,并使用此段落作为示例输入,以下调用有意义且有效: forth_word = Par.sentence[0].word[3] puts forth_word.text #"ruby" puts forth_word.type #:noun 相互包含的类的伪代码:(有点嵌套,但不是严格意义上的OOP) 当我尝试导航到Ruby对象树时,棘手的部分就变成了…也就是从属于句子或段落对象的单词内部的信息中询问。关于如何编写最后两种方法的任何建议: puts

在ruby对象中向下导航非常简单。给定以下伪代码,并使用此段落作为示例输入,以下调用有意义且有效:

forth_word = Par.sentence[0].word[3]
puts forth_word.text #"ruby"
puts forth_word.type #:noun
相互包含的类的伪代码:(有点嵌套,但不是严格意义上的OOP)

当我尝试导航到Ruby对象树时,棘手的部分就变成了…也就是从属于句子或段落对象的单词内部的信息中询问。关于如何编写最后两种方法的任何建议:

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

每个单词都可以有一个指向其所在句子的句子变量。句子和段落以及段落和页面也是如此。

首先,您的类不是嵌套的。它们应该在彼此内部声明

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不同,您不能从内部类访问外部类的变量。 使用模块比使用嵌套类更好

但是,如果您仍然希望使用与示例中相同的层次结构,请注意访问类之外的数据。 例如,如果您试图执行这段代码,您将得到一个错误

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

  def in_a_quote?
    #... return Sentence.@is_a_quote 
  end
end

w = Word.new
w.is_a_quote?  

这是非常危险的,与OOP原则相矛盾

这种类型的数据结构不适合您的要求。将数据存储在sql中,并按照您的设想使用ORM检索数据。请将“sudo”更改为“pseudo”。这快把我逼疯了。另外,要嵌套
句子
单词
,您需要定义它们
类句子<段落
类单词<句子
@CarySwoveland:Omigod,您是个天才。我当时正试图弄清楚这和超级用户权限有什么关系。。。但你在下一句话中错了:OP不是通过层次结构(is-a)嵌套,而是通过包含(has-a,在实例变量中),这是正确的做法:一个
肯定不是一种
句子
,一个
句子也不是一种
段落
@Amadan,哈!,谢谢你的更正。现在我要回到Sleepzzz。我同意“嵌套”不是一个合适的术语,但不知道如何描述它。你能解释为什么这是危险的,它会违反什么原则吗?这是危险的,因为方法Word.is_a_quote依赖于假设,然后有一些句子类的对象,它有一个参数@is_a_quote。但是,如果我们从句子类中删除@is_a_quote,或者只是尝试执行我在回答中编写的一段代码,这个方法会返回什么呢?完全违反了封装。如果你想要一个方法`是引文吗?你必须在最合乎逻辑的地方在句子类中声明它。谢谢!这似乎是一个直截了当的解决方案(我不知道为什么我没有想到),我唯一的反对意见是它似乎不是很干。对于我创建的每个类,我都要记住在“父”类中放置一个占位符。也许这是OOP设计的唯一可能的解决方案,但我认为可能存在本机方法。这似乎类似于浏览网页DOM树或XML文档。不确定这些解析器是否像您描述的那样使用指针或其他神奇的东西。默认情况下,Ruby变量是通过引用传递的,所以它很可能是指针(但我不确定)。我相信我的解决方案是枯燥的,因为没有重复的代码。
class Word
  @text =# "ruby"
  @type =# :noun 

  def in_a_quote?
    #... return Sentence.@is_a_quote 
  end
end

w = Word.new
w.is_a_quote?