如何摆脱TypeError

时间:2010-10-02 18:22:29

标签: ruby

我有我的班级


class A
  def to_s
    'string'
  end
  def inspect
    'string'
  end
end

尝试做这样的事情


a = A.new
'somestring' + a

错误是“在`+'中:无法将A转换为String(TypeError)”

有没有办法解决它?

P.S。使用'somestring'+ a.to_s不是一个选项。

找到答案。需要to_str方法。

1 个答案:

答案 0 :(得分:1)

#to_s用于对象表示为String。在您的情况下,您需要对象转换为String,因为String#+仅处理String。在Ruby中,类型转换是使用to_X方法的三字母形式完成的,即to_intto_aryto_hash(有人不能算三...... ),to_str等等。

因此,您需要实施to_str才能实现这一目标。

然而,如果你的对象 是一个字符串,你应该实现to_str!如果是其他内容,则不得实现to_str,而是让客户端使用to_s将其明确表示为字符串。

基本上,在Ruby中实现to_str就像从Java中的String继承一样:这意味着A IS-A String

举个例子,看看Ruby核心库中哪些类实际上实现了类型转换方法:

  • 唯一实现to_ary的类,是Array本身,
  • 唯一实现to_hash的类,是Hash本身和
  • 唯一实现to_str的类是String本身。

这应该向您显示实施to_str是一个非常严重的问题,不应轻易采取。

唯一不具备简单的无操作实现的转换方法是to_int,它也由FloatNumeric实现。实际上,我认为这是一个错误,因为有Float个无限Integer s。Numeric s。 IntegerNumeric超类,所以说每Integer个IS-A {{1}}都更奇怪。