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

ver*_*coe 1 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
Run Code Online (Sandbox Code Playgroud)

在创建了诸如object1 = Node.new(12)和之类的对象之后object2 = Node.new("Foo"),我可以使用该get_value方法来获取对象值,这正是该方法应该做的事情.

puts object1.get_value
==> 12
puts object2.get_value
==> Foo
Run Code Online (Sandbox Code Playgroud)

然而,当只使用puts object1puts object2仍然是对象值时,显示12和Foo.在这里,我期待一个更加神秘的消息,告诉我这是类节点的一个对象,它就是对象.

puts object1.class
==> Node
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*ity 5

putsto_s在打印之前调用对象上的方法.您已经定义to_s在类中调用to_s@value.因此,类的实例具有与它们保存的值相同的字符串表示形式.

如果你愿意的话

class Node
  # ...

  def to_s
    "Node<#{@value.to_s}>"
  end
end
Run Code Online (Sandbox Code Playgroud)

你会得到的

node = Node.new(42)
puts node
# Node<42>
Run Code Online (Sandbox Code Playgroud)

作为旁注:您的Ruby代码不是非常惯用,这里有一些观察:

  • 省略空括号 ()
  • 无需编写getter和setter,这attr_accessor就是为了什么
  • 实例变量自动设置为 nil
  • 在构造函数之外,最好使用getter value而不是实例var@value
  • 畸形的缩进

这是一个等效的实现:

class Node
  attr_accessor :value, :successor

  def initialize(value)
    @value = value
  end

  def to_s
    value.to_s
  end
end
Run Code Online (Sandbox Code Playgroud)

在行动:

node = Node.new(42)
node.value = 123

succ = Node.new(124)
node.successor = succ

puts node
# 123

puts node.successor
# 124
Run Code Online (Sandbox Code Playgroud)

如果您不想使用setter value,请使用attr_reader而不是attr_accessor.