Если вы хотите интерполировать некоторые двойные кавычки в строку, вы можете попробовать это:
iex(1)> text = "This is a name=#{"abc"} string"
"This is a name=abc string"
Это не сработало.Вам нужно сделать что-то дополнительное:
iex(16)> text = "This is a name=#{"\"abc\""} string"
"This is a name=\"abc\" string"
Когда вы пишете что-то вроде этого:
text = "This is a name="abc" string"
Вы должны задаться вопросом, как получается, что эликсир знает, что последняя цитата - это цитата, которая заканчиваетсястрока.Другими словами, почему эликсир не думает, что это ваша строка:
text = "This is a name="
, а остальная часть строки - просто мусор, который не соответствует синтаксису эликсира?Чтобы сказать эликсиру, что двойная кавычка после знака =
- это не конец строки, а просто еще один символ в строке, вы экранируете двойная кавычка, например:
text = "This is a name=\"abc\" string"
Теперь эликсир увидит двойную кавычку после string в качестве окончания строки.
Далее, это сложная задача избежать двойных кавычек в строке, поэтому elixir предоставляет возможность избежать этого с ~s
сигилой:
iex(17)> text = ~s{This is a name="abc" string}
"This is a name=\"abc\" string"
С символом ~s
вы можете использовать различныепары символов, которые окружают вашу строку, например ()
или <>
или | |
или / /
.Вам нужно использовать пару символов, которая не найдена в строке - иначе вы столкнетесь с той же проблемой, что и с внутренними двойными кавычками.
Наконец, вы можете доказать, что строка name=\"abc\"
имеет только 10символы, то есть символы name="abc"
, например:
iex(13)> s1 = ~s{name="abc"}
"name=\"abc\""
iex(14)> String.length s1
10