符号到字符串问题

Nic*_*ilt 38 ruby string symbols

以下代码失败

world = :world
result = 'hello' + world
puts result #=> can't convert Symbol into String
Run Code Online (Sandbox Code Playgroud)

以下代码有效

world = :world
result = "hello #{world}"
puts result #=> hello world
Run Code Online (Sandbox Code Playgroud)

为什么?

使用ruby 1.8.7

mu *_*ort 53

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

result = "hello #{expr}"
Run Code Online (Sandbox Code Playgroud)

或多或少等同于此:

result = "hello " + expr.to_s
Run Code Online (Sandbox Code Playgroud)

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


And*_*imm 5

如果world是数字,则会发生相同的行为.

"hello" + 1 # Doesn't work in Ruby
"hello #{1}" # Works in Ruby
Run Code Online (Sandbox Code Playgroud)

如果要在某些内容中添加字符串,请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"
Run Code Online (Sandbox Code Playgroud)

to_s意思是"你可以把我变成一个字符串",to_str意思是"为了所有意图和目的,我是一个字符串".