为什么?无法转换为字符串:我确实有一个to_s方法!

4
我不明白以下代码为什么会引发异常:
class X
  def to_s
    "x"
  end
end

s = ""
s << X.new
# --> TypeError: can't convert X into String

毕竟,'to_s'应该将X转换为字符串。

3个回答

8
短转换并不会被 Ruby 核心自动调用;这就是长转换的作用。长转换旨在处理与目标类型非常相似的事物,而不是仅仅具有目标类型的表示形式的事物。
使用:to_str 也就是说,如果您在类中添加 def to_str; "x"; end<< 表达式将自动进行转换。

6

毕竟,to_s 应该将 X 转换为 String

不是的,它应该把它表示成一个 Stringto_str 才是应该将其转换的方法。


-1
Ruby 中没有任何自动类型转换; 您必须显式调用您的方法 to_s:
s << X.new.to_s

事实证明,我只需要使用上面的 to_str。 - radiospiel
@radiospiel 是正确的。有几种自动转换。一方面,Ruby核心几乎在任何地方都应用长转换(to_int,to_str等)。只是短转换器是用于显式使用的,因此它们不是“自动”的。 - DigitalRoss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接