向上导航Ruby对象
在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
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?