Ruby BST:为什么这段代码需要' self'制作一个新节点?

时间:2016-08-19 01:42:25

标签: ruby binary-search-tree

我用Ruby编写了二进制搜索树代码。我现在想知道为什么此代码需要self中的self.left = Node.new(3)来创建新节点。

我认为self可以像left = Node.new(3)一样被移除,因为在这种情况下接收器是显而易见的(应用了insert_left方法的实例)。但这似乎是错的..你能帮我解释为什么我的想法是错误的。

module BinaryTree
class Node
  attr_accessor :value, :left, :right

def initialize(value)
  @value = value
end

def insert(v)
  case @value <=> v
  when 1 then insert_left(v)
  when -1 then insert_right(v)
  when 0 then nil
  end
end


private
def insert_left(v)
  if left
    left.insert(v)
  else
   self.left = Node.new(v)
  end
end

def insert_right(v)
  if right
    right.insert(v)
  else
    self.right = Node.new(v)
  end
end

end
end

1 个答案:

答案 0 :(得分:1)

致电left = x,将其解释为变量分配。致电self.left = xleft= self的方法调用。这些显然是两件不同的事情,但除非你熟悉这种可能没有任何意义的符号。它不是特别直观,对于初学者来说相当困惑,特别是当x = left工作正常而不必明确left是变量或方法调用时。

与某些在本地变量(Perl,PHP等)上有前缀的语言不同,Ruby中没有这样的标识符。因此,它将lvalue = expr形式的内容解释为变量赋值,将object.property = expo解释为对mutator方法的方法调用。

Ruby确实识别了实例级别变量,例如@x = expr@@y = expr,但这完全不同。