【发布时间】:2018-06-06 23:49:48
【问题描述】:
我在 ruby 中实现 BST 并使用递归编写插入方法。
我正在尝试使用 attr_accessor 设置和获取 root 但它不起作用。有人可以帮忙吗?
class Node
attr_accessor :value, :left_child, :right_child
def initialize (value)
@value = value
@left_child = nil
@right_child = nil
end
end
class BST
attr_accessor :root
def initialize
@root = nil
end
def insert(value, node)
if node == nil
node = Node.new(value)
return node
end
return node if node.value == value
if node.value > value
if node.left_child == nil
node.left_child = Node.new(value)
return
else
insert(value, node.left_child)
end
else
if node.right_child == nil
node.right_child = Node.new(value)
return
else
insert(value, node.right_child)
end
end
end
end
mybst = BST.new
p mybst.root
mybst.insert(1, mybst.root)
mybst.insert(2, mybst.root)
mybst.insert(10, mybst.root)
mybst.insert(12, mybst.root)
p mybst
上面的代码展示了一个简单的 Node 类和一个带有 insert 方法的 BST 类的实现。给我#<BST:0x00557398d02378 @root=nil>
如果我使用 self.root 就可以了。
可以使用@root 访问根目录,但类不应直接与其实例变量交互。这就是为什么我们需要 attr_accessor 提供的 getter 和 setter 方法。但它不起作用。我错过了什么?
以下是《POODR》一书的截图。它说即使在课堂上也不要直接使用实例变量。
【问题讨论】:
-
请记住,Ruby 中唯一逻辑错误的东西是
nil和false,所以除非有某种方式,像right_child这样的东西可以永远是false建议进行== nil之类的比较。这不仅会使您的代码混乱并引发有关该属性可以包含哪些值的问题,而且如果您错误地输入了= nil,则存在意外分配的风险。 -
@tadman 嘿!如果 OP 将其移交给 CR.se,我想进行评论! ;)
-
@thesecretmaster 这只是开始。您可以在这里传达很多内容,使其更像 Ruby。
-
@tadman 我知道,我只是在开玩笑。
标签: ruby class oop getter-setter object-oriented-analysis