我遇到了一个ruby二叉树实现,并且非常喜欢对代码的某些部分进行一些澄清,这是我以前从未见过的,使用Enumerable。 我对#words方法在#entries中所做的事情感到迷茫?我查找了ruby文档中的条目,但仍然感到困惑,而#insert_into方法,节点的值是如何以及在哪里存储在@left,@ right实例变量中?
class Node
attr_reader :word, :count, :left, :right
include Enumerable
def initialize(word)
@word, @count = word, 1
end
def size
size = 1
size += @left.size unless left.nil?
size += @right.size unless right.nil?
size
end
def insert(another_one)
case @word <=> another_one.word
when 1
insert_into(:left, another_one)
when 0
@count += 1
when -1
insert_into(:right, another_one)
end
end
def each
@left.each {|node| yield node } unless @left.nil?
yield self
@right.each {|node| yield node } unless @right.nil?
end
def words
entries.map {|e| e.word }
end
def count_all
self.map { |node| node.count }.reduce(:+)
end
def insert_into(destination, another_one)
var = destination.to_s
eval(%Q{
if @#{var}.nil?
@#{var} = another_one
else
@#{var}.insert(another_one)
end
})
end
答案 0 :(得分:0)
entries
来自Enumerable
,由于我无法解释的原因,documentation for entries
非常糟糕。如果与to_a
不相同,则使用each
来构造数组元素,它似乎大致等效。如果未指定显式接收器,则会将其发送到Node
的当前实例。
对于insert_into
,它使用Ruby的eval
方法,它允许您在运行时将文本解释为Ruby代码。如果你查看传递给eval
的字符串,你应该能够弄清楚它的作用。