在String类(版本2.2.0)的ruby doc中,我找到了类方法' try_convert'那个,训练文档本身应该做:
Try to convert obj into a String, using #to_str method. Returns converted string or nil if obj cannot be converted for any reason.
所以我决定对它进行测试,并且我已经使用以下代码和结果完成了测试。
require 'bigdecimal'
z=BigDecimal.new "12.4"
puts z
zc=String.try_convert(z)
i=365
ic=String.try_convert(i)
puts "Test of try_convert on a bigdecimal. The result is: #{zc.nil? ? 'nil' : zc }"
puts "While, the #to_s method on z returns: #{z.to_s}"
puts "The integer i, converted with try_convert is: #{ic.nil? ? 'nil' : ic}"
puts "While, the #to_s method on i returns: #{i.to_s}"
class MyClass
end
c=MyClass.new
cc=String.try_convert(c)
puts "Test of try_convert on a custom class. The result is: \"#{cc.nil? ? 'nil' : cc}\""
puts "While, the #to_s method on c returns \"#{c.to_s}\""
结果:
在bigdecimal上测试try_convert。结果是: nil
同时,z上的#to_s方法返回:0.124E2
使用try_convert转换的整数i为: nil
而i上的#to_s方法返回:365
在自定义类上测试try_convert。结果是:" nil "
同时,c上的#to_s方法返回#< MyClass:0x98d12d4>
所以我非常困惑:在开始时,我觉得很明显try_convert会尝试在参数上调用to_s方法,但这个例子似乎表明这不是真的。我错过了什么?这个方法意味着什么?
答案 0 :(得分:3)
try_convert
实际上会尝试在论证上调用to_str
,而不是to_s
:
class Foo
def to_str
"hello!"
end
end
String.try_convert(Foo.new) # => "hello!"
to_str
通常用于表示您的对象可以用来代替String(与只有String表示不同)。
答案 1 :(得分:1)
我将从你自己的问题中引用两行,重点是:
在我看来,
try_convert
会尝试在参数上调用to_s
方法尝试使用
obj
方法将String
转换为#to_str
。
发现差异?