这种连接的操作顺序是什么?

时间:2009-03-20 21:17:40

标签: ruby string symbols operator-precedence

x = "hello" " world".to_sym
puts x.class

这有效并允许我将两个字符串连接成一个符号,产生输出:

Symbol

但是如果我稍微更改它以使用+而不是分隔hello和world字符串的空格,我会收到错误:

x = "hello" + " world".to_sym
puts x.class

这会产生以下错误 - 我认为这是因为它试图将“world”.to_sym调用回一个字符串,然后再连接到“hello”字符串:

in `+': can't convert Symbol into String (TypeError)

我想知道第一个例子的作用是什么?有谁知道这里的运营顺序是什么?我怀疑这两个字符串实际上被视为一个,它们之间的空格被忽略,并且在调用to_sym方法之前它们被连接起来。我实际上希望它的工作方式与第二个例子没有区别,因为我认为在任何尝试加入“hello”和“world”的内容之前,都会在“world”字符串上调用to_sym。

2 个答案:

答案 0 :(得分:4)

第一个例子是语法糖,通常你会看到这样写:

x = "Here is a string that " \
    "I want to split across " \
    "several lines..."

所以这首先发生在to_sym之前。在第二个例子中,你实际上是在呼叫:

x = "hello".+( "world".to_sym )

显然不会起作用,因为String#+无法对符号作为参数做任何有用的事情。

简而言之,不要做第一个,如果你想做"hello world".to_sym并且你不能因为任何原因那样写它,那么只需使用括号:("hello" + " world").to_sym

答案 1 :(得分:1)

两个或多个字符串文字放在彼此旁边,就像立即将其视为单个字符串文字一样。当Ruby解释器将您的代码转换为令牌时,它会转换

"hello" " world"

到单个令牌string "hello world"并转换

"hello" + " world"

至三个令牌:string "hello"method +string " world"。然后,它会在实际执行代码时将字符串连接在一起。