Каков порядок операций с этой конкатенацией? - PullRequest
2 голосов
/ 21 марта 2009
x = "hello" " world".to_sym
puts x.class

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

Symbol

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

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

Это приводит к следующей ошибке - я думаю, что это происходит потому, что он пытается «привести» вызов «world» .to_sym к строке перед объединением ее в строку «hello»:

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

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

Ответы [ 2 ]

4 голосов
/ 21 марта 2009

Первый пример - синтаксический сахар, обычно вы видите это написано так:

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 голос
/ 21 марта 2009

Две или более строки литералов , помещенных рядом друг с другом, как это, немедленно обрабатываются как один строковый литерал Когда интерпретатор Ruby преобразует ваш код в токены, он конвертирует

"hello" " world"

в одиночный токен string "hello world" и он преобразует

"hello" + " world"

до трех токенов: string "hello", method + и string " world". Затем он будет объединять строки позже при фактическом выполнении кода.

...