2009-03-20 3 views
2
x = "hello" " world".to_sym 
puts x.class 

Это работает и позволяет мне объединить две строки в символ, производя вывод:Каков порядок операций с этим конкатенацией?

Symbol 

Но если я изменить его немного, чтобы использовать + вместо пробела отделяя приветствия и мировые строки , я получаю сообщение об ошибке:

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

Это производит следующее сообщение об ошибке - Я думаю, это потому, что он пытается «бросить» в «мир» .to_sym перезвонить в строку перед конкатенация его на «привет» строка :

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

Мне интересно Что делает первый пример работы? Кто-нибудь знает, что такое порядок операций? Я подозреваю, что две строки фактически рассматриваются как одна, что пространство между ними игнорируется, и они конкатенируются до того, как вызывается метод to_sym. На самом деле я бы ожидал, что он будет работать не иначе, как второй пример, потому что я думал, что to_sym будет вызван в «мировой» строке, прежде чем предпринимаются попытки присоединиться к содержимому «привет» и «мир».

ответ

1

Два или более строк литералы, помещенные рядом друг с другом, так же как и те, которые рассматриваются как однострочный литерал. Когда интерпретатор Рубин преобразует код лексемы, он преобразует

"hello" " world" 

к одной лексемы string "hello world" и преобразует

"hello" + " world" 

на три лексемы: string "hello", method + и string " world". Затем он объединяет строки вместе, когда на самом деле выполняется код.

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