我在Ruby中构建一个简单的工厂,返回一个Callable
(在这种情况下为Lambda
),知道如何转换为传递的类型名称(例如{ {1}})。
尝试使用String.name # => 'String'
投射Fixnum
,如果传递的值不可转换,则Integer
会失败。同样,我使用Float
,Time.zone.parse(x).to_time
等...
然而,对于String
,我发现自己只是使用#to_s
,我相信这会使Lambda
稍微不一致,因为String
转换器以外的所有转换器都会失败(提出Exception
)。
假设没有恶意的猴子补丁,除了Rails提供的补丁之外,#to_s
永远不会引发异常是真的吗?
答案 0 :(得分:1)
每个对象都继承自Object,它实现默认的to_s
和inspect
,返回"#"串。因此,如果您不会覆盖该定义,#to_s将适用于每个类。
但是,可以编写自己的#to_s实现并在那里引发异常,但不太可能 - 我无法想象为什么有人会这样做。
答案 1 :(得分:0)
Ruby中的每个对象都继承自具有to_s实现的基础对象,因此您应该没问题。请记住,结果并不总是可预测的。
例如。 nil.to_s返回“”
答案 2 :(得分:0)
#to_X
方法(to_a
,to_h
,to_s
,to_f
,to_i
,to_c
,{{1 }}和to_r
(to_XYZ
,to_ary
,to_hash
,to_str
,to_float
,to_int
,{{1 }},to_sym
,to_proc
,to_io
)方法不应失败。一个对象可能无法响应它们中的某些或任何一个,但如果它 响应,那么它不应该失败,它不应该引发异常并且应该返回正确类的实例
我不确定文档中是否真正明确说明了这一点,但这是Ruby社区对待它们的方式。
to_enum
方法(to_path
,Kernel#XYZ
,Kernel#Array
,Kernel#Complex
,Kernel#Float
,Kernel#Hash
,{{1如果参数不可转换,OTOH将引发异常。
因此,简而言之: iff 一个对象响应Kernel#Integer
,然后不应该失败,但是,它可能会选择不回复Kernel#Rational
(这非常不寻常)。