仅用于练习我用ruby实现了一个队列类。队列中的元素是节点,它们在另一个类中实现。这些节点保持一定的值,并且在添加到队列时还可以保存有关其后继的信息。节点类如下所示:
class Node
attr_accessor :value, :successor
def initialize(value)
@value = value
@successor = nil
end
def set_successor(successor)
@successor = successor
end
def get_successor()
@successor
end
def get_value()
@value
end
def to_s()
@value.to_s
end
end
创建对象(例如object1 = Node.new(12)
和object2 = Node.new("Foo")
)后,我可以使用get_value
方法获取对象值,这正是该方法应该执行的操作。
puts object1.get_value
==> 12
puts object2.get_value
==> Foo
然而,当只使用puts object1
或puts object2
时,仍然是对象值,12和Foo是
显示。在这里,我希望有一个更加神秘的消息,告诉我这是类节点的一个对象,它就是对象。
puts object1.class
==> Node
那么,是否有人知道一个提示,为什么显示对象值,实际上应该显示整个对象?
答案 0 :(得分:5)
puts
calls the to_s
method on objects before printing them。您已在班级中定义to_s
来致电to_s
的{{1}}。因此,您的类的实例具有与它们保存的值相同的字符串表示形式。
如果你要写
@value
你会得到
class Node
# ...
def to_s
"Node<#{@value.to_s}>"
end
end
作为旁注:您的Ruby代码不是非常惯用,这里有一些观察:
node = Node.new(42)
puts node
# Node<42>
()
的用途attr_accessor
nil
而不是实例var value
这是一个等效的实现:
@value
行动中:
class Node
attr_accessor :value, :successor
def initialize(value)
@value = value
end
def to_s
value.to_s
end
end
如果您不想使用node = Node.new(42)
node.value = 123
succ = Node.new(124)
node.successor = succ
puts node
# 123
puts node.successor
# 124
的设置器,请使用value
代替attr_reader
。