ruby try_convert类方法不转换

时间:2014-12-27 17:14:14

标签: ruby

在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方法,但这个例子似乎表明这不是真的。我错过了什么?这个方法意味着什么?

2 个答案:

答案 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

发现差异?