Строка Ruby добавляет символ '\'

почему ruby ​​добавляет символ '\', когда я пытаюсь запустить код ниже. Это происходит только с '#$'

Это происходит со всеми рубиновыми версиями.

puts '#$'   => '\#$'

or

'#$'  => '\#$'

or

'mypassord#$123'  =>  'mypassord\#$123'

Пожалуйста, поделитесь своим опытом здесь. Это рубиновая проблема или что-то в этом роде?


person RKP    schedule 18.07.2014    source источник
comment
Результат, который вы показали, у меня не совсем такой. Вы что-то минимизировали? :-) Я получаю "\\\#$" .   -  person Arup Rakshit    schedule 18.07.2014
comment
@ArupRakshit нет, просто откройте irb и введите '#$'. Я получил это.   -  person RKP    schedule 18.07.2014
comment
да .. Если я запускаю его в IRB, я получаю то, что показано выше. Но если я запускаю его из командной строки Vim, я получаю '#$'.   -  person Arup Rakshit    schedule 18.07.2014
comment
Хорошо.. из vim теперь puts '#$'.inspect выдает точно так же, как у вас.   -  person Arup Rakshit    schedule 18.07.2014
comment
Я думаю, вы оба неправы. Проверка строк Ruby использует двойные кавычки. Это должно быть "\#$", и это очень важно, поскольку строковые литералы в одинарных кавычках не имеют интерполяции.   -  person sawa    schedule 18.07.2014
comment
@sawa Ничего плохого .. Я знаю, что ты сказал. Я пытаюсь получить точный результат, такой как OP. :-)   -  person Arup Rakshit    schedule 18.07.2014


Ответы (1)


Нет, это не рубиновая проблема. Это ваша проблема. Поскольку #$foo можно интерпретировать как интерполяцию глобальной переменной $foo, необходимо экранировать символ #. Вот почему есть обратная косая черта.

Точнее, нет возможности интерполяции со строкой "#$" ($ — недопустимая глобальная переменная) или "#$123" ($123 — недопустимая глобальная переменная), но это усложняет алгоритм проверки или алгоритм интерполяции для проверки последовательности после #$, так что я думаю, именно поэтому # экранируется даже в таких случаях.

person sawa    schedule 18.07.2014
comment
Ты прав. IRB вызывает #inspect, что делает его строкой в ​​двойных кавычках. Согласно правилу, внутри строки в двойных кавычках все специальные символы должны быть экранированы. # имеет особое значение внутри строки в двойных кавычках, поэтому его нужно останавливать с помощью обратной косой черты. - person Arup Rakshit; 18.07.2014
comment
@ArupRakshit Это не совсем правильно. # сам по себе не является специальным символом ("foo#bar"). Это зависит от контекста. - person sawa; 18.07.2014
comment
Да.. Это то, что я хотел сказать.. :-) Вы использовали правильное слово. - person Arup Rakshit; 18.07.2014
comment
Интерполяция Ruby работает с двойной кавычкой, но я использую одинарную кавычку... Этого не должно происходить с одинарной кавычкой. - person RKP; 18.07.2014
comment
RKP.. Вы использовали его в IRB, а IRB сделал его двойным в кавычках, вызвав #inspect. - person Arup Rakshit; 18.07.2014
comment
Тогда какое решение, если мне нужна точная строка, которую я ввел. - person RKP; 18.07.2014
comment
@RKP Это невозможно получить. В момент разбора строкового литерала он интерпретируется как строковый объект, а литеральное выражение отбрасывается. Невозможно отличить 'foo' от "foo". - person sawa; 18.07.2014