符号到字符串问题

时间:2010-12-06 02:04:14

标签: ruby string symbols

以下代码失败

world = :world
result = 'hello' + world
puts result #=> can't convert Symbol into String

以下代码正常工作

world = :world
result = "hello #{world}"
puts result #=> hello world

为什么?

使用ruby 1.8.7

4 个答案:

答案 0 :(得分:52)

字符串插值是隐式to_s调用。所以,像这样:

result = "hello #{expr}"

或多或少等同于:

result = "hello " + expr.to_s

正如karim79所说,符号不是字符串,但符号确实有to_s方法,因此插值有效;您尝试使用+进行连接不起作用,因为没有可用的+实现可以理解左侧的字符串和右侧的符号。

答案 1 :(得分:5)

如果world是数字,则会出现相同的行为。

"hello" + 1 # Doesn't work in Ruby
"hello #{1}" # Works in Ruby

如果您想在某些内容中添加字符串,请在其上实施to_str

irb(main):001:0> o = Object.new
=> #<Object:0x134bae0>
irb(main):002:0> "hello" + o
TypeError: can't convert Object into String
        from (irb):2:in `+'
        from (irb):2
        from C:/Ruby19/bin/irb:12:in `<main>'
irb(main):003:0> def o.to_str() "object" end
=> nil
irb(main):004:0> "hello" + o
=> "helloobject"

to_s表示“你可以把我变成一个字符串”,而to_str表示“为了所有意图和目的,我是一个字符串”。

答案 2 :(得分:2)

符号是一个字符串,因此无法在没有显式转换的情况下连接到一个符号。试试这个:

result = 'hello ' + world.to_s
puts result

答案 3 :(得分:1)

作为旁注,您始终可以自己定义方法:)

ruby-1.9.2-p0 > class Symbol
ruby-1.9.2-p0 ?>  def +(arg)
ruby-1.9.2-p0 ?>    [to_s, arg].join(" ")
ruby-1.9.2-p0 ?>    end
ruby-1.9.2-p0 ?>  end
 => nil 
ruby-1.9.2-p0 > :hello + "world"
 => "hello world"