我用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
答案 0 :(得分:1)
致电left = x
,将其解释为变量分配。致电self.left = x
是left=
self
的方法调用。这些显然是两件不同的事情,但除非你熟悉这种可能没有任何意义的符号。它不是特别直观,对于初学者来说相当困惑,特别是当x = left
工作正常而不必明确left
是变量或方法调用时。
与某些在本地变量(Perl,PHP等)上有前缀的语言不同,Ruby中没有这样的标识符。因此,它将lvalue = expr
形式的内容解释为变量赋值,将object.property = expo
解释为对mutator方法的方法调用。
Ruby确实识别了实例和类级别变量,例如@x = expr
和@@y = expr
,但这完全不同。