向上导航 Ruby 对象

Navigating up Ruby Objects

在 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 Sentence.@is_a_quote 
  end

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

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

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

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

首先,您的 classes 没有嵌套。它们应该在彼此内部声明。

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

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

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

但与 Java 不同,在 Ruby 中,您无法从内部变量访问外部 class 的变量。 Ruby Constants and Nested Classes 而且最好使用模块而不是嵌套 classes.

但是如果您仍想使用与示例中相同的层次结构,请注意访问 class 之外的数据。 例如,如果你尝试执行这段代码,你会得到一个错误

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 原则相矛盾。