<p>在Ruby中,通常有四种方法可用于获取对象的字符串表示。</p>
<ol>
<li><code>#to_str</code>:这是Ruby标准类型转换协议的一部分(类似于<code>to_int</code>,<code>to_ary</code>,<code>to_float</code>,…)。如果和<em>仅当对象实际上是一个字符串,但由于任何原因不是<code>String</code>类的实例时才使用。这是极不寻常的。实际上,在整个核心库中,<code>String</code>类本身只有no-op实现。</li>
<li><code>#to_s</code>:这也是Ruby标准类型转换协议的一部分(类似于<code>to_i</code>,<code>to_a</code>,<code>to_f</code>,…)。如果对象具有某种合理的字符串表示形式,则使用它。它实际上不需要<em>成为</em>字符串。几乎所有的物体都应该对此做出反应。</li>
<li><code>Kernel#String(obj)</code>:这也是Ruby标准类型转换协议的一部分(类似于<code>Kernel#Integer(obj)</code>,<code>Kernel#Array(obj)</code>,<code>Kernel#Float(obj)</code>,…)。它与<code>obj.to_s</code>相同。</li>
<li><code>#inspect</code>:它应该返回对象的可读描述,以便进行调试。换句话说:它是用来检查一个物体(duh)。</li>
</ol>
<p>打印对象有三种方法:</p>
<ol>
<li><code>Kernel#print(obj, ...)</code>:打印由<code>$,</code>分隔并由<code>$\</code>终止的所有<code>obj</code>。如果<code>obj</code>不是<code>String</code>,则<code>print</code>将首先调用<code>obj.to_s</code>。</li>
<li><code>Kernel#puts(obj, ...)</code>:基本上等同于<code>$stdout.puts(obj, ...)</code>。它还打印<code>obj</code>s,但通常用新行分隔它们。但是,它也有一些特殊的case行为,特别是它通过在新行上打印每个项来特别处理数组。</li>
<li><code>Kernel#p(obj, ...)</code>:类似于<code>puts</code>,但对所有<code>obj</code>s调用<code>#inspect</code></li>
</ol>
<p>除此之外,标准库中还有<code>pp</code>(漂亮的打印)库,它添加了<code>Kernel#pp(obj, ...)</code>方法。</p>
<p>然后是<code>awesome_print</code>库和<code>hirb</code>。</p>