需要Ruby二叉树实现说明

时间:2013-12-28 16:47:45

标签: ruby binary-tree

我遇到了一个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

1 个答案:

答案 0 :(得分:0)

entries来自Enumerable,由于我无法解释的原因,documentation for entries非常糟糕。如果与to_a不相同,则使用each来构造数组元素,它似乎大致等效。如果未指定显式接收器,则会将其发送到Node的当前实例。

对于insert_into,它使用Ruby的eval方法,它允许您在运行时将文本解释为Ruby代码。如果你查看传递给eval的字符串,你应该能够弄清楚它的作用。