#to_s会失败吗?

时间:2014-07-24 13:30:26

标签: ruby-on-rails ruby casting

我在Ruby中构建一个简单的工厂,返回一个Callable(在这种情况下为Lambda),知道如何转换为传递的类型名称(例如{ {1}})。

尝试使用String.name # => 'String'投射Fixnum,如果传递的值不可转换,则Integer会失败。同样,我使用FloatTime.zone.parse(x).to_time等...

然而,对于String,我发现自己只是使用#to_s,我相信这会使Lambda稍微不一致,因为String转换器以外的所有转换器都会失败(提出Exception)。

假设没有恶意的猴子补丁,除了Rails提供的补丁之外,#to_s永远不会引发异常是真的吗?

3 个答案:

答案 0 :(得分:1)

每个对象都继承自Object,它实现默认的to_sinspect,返回"#"串。因此,如果您不会覆盖该定义,#to_s将适用于每个类。

但是,可以编写自己的#to_s实现并在那里引发异常,但不太可能 - 我无法想象为什么有人会这样做。

答案 1 :(得分:0)

Ruby中的每个对象都继承自具有to_s实现的基础对象,因此您应该没问题。请记住,结果并不总是可预测的。

例如。 nil.to_s返回“”

答案 2 :(得分:0)

#to_X方法(to_ato_hto_sto_fto_ito_c,{{1 }}和to_rto_XYZto_aryto_hashto_strto_floatto_int,{{1 }},to_symto_procto_io)方法不应失败。一个对象可能无法响应它们中的某些或任何一个,但如果它 响应,那么它不应该失败,它不应该引发异常并且应该返回正确类的实例

我不确定文档中是否真正明确说明了这一点,但这是Ruby社区对待它们的方式。

to_enum方法(to_pathKernel#XYZKernel#ArrayKernel#ComplexKernel#FloatKernel#Hash,{{1如果参数不可转换,OTOH将引发异常。

因此,简而言之: iff 一个对象响应Kernel#Integer,然后不应该失败,但是,它可能会选择不回复Kernel#Rational(这非常不寻常)。