2
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。

4

2 回答 2

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

于 2009-03-20T21:31:50.513 回答
1

两个或多个并排放置的字符串文字立即被视为单个字符串文字。当 Ruby 解释器将您的代码转换为标记时,它会将

"hello" " world"

到单个令牌string "hello world",它转换

"hello" + " world"

到三个标记:string "hello"method +string " world"。然后在实际执行代码时将字符串连接在一起。

于 2009-03-20T21:35:39.537 回答