我有我的班级
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方法。
答案 0 :(得分:1)
#to_s
用于将对象表示为String
。在您的情况下,您需要将对象转换为String
,因为String#+
仅处理String
。在Ruby中,类型转换是使用to_X
方法的三字母形式完成的,即to_int
,to_ary
,to_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
,它也由Float
和Numeric
实现。实际上,我认为这是一个错误,因为有Float
个无限Integer
s。Numeric
s。 Integer
是Numeric
的超类,所以说每Integer
个IS-A {{1}}都更奇怪。