为什么ruby返回对象的值而不是整个对象?

时间:2014-06-16 07:35:06

标签: ruby object

仅用于练习我用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 object1puts object2时,仍然是对象值,12和Foo是 显示。在这里,我希望有一个更加神秘的消息,告诉我这是类节点的一个对象,它就是对象。

puts object1.class
==> Node

那么,是否有人知道一个提示,为什么显示对象值,实际上应该显示整个对象?

1 个答案:

答案 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>
  • 无需编写getter和setter,这就是()的用途
  • 实例变量自动设置为attr_accessor
  • 在构造函数之外,最好使用getter 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