Выбрать главу

s1 = "Это знак табуляции: (\t)"

s2 = "Несколько символов забоя: xyz\b\b\b"

s3 = "Это тоже знак табуляции: \011"

s4 = "А это символы подачи звукового сигнала: \а \007"

Внутри строки, заключенной в двойные кавычки, могут встречаться даже выражения (см. раздел 2.21).

2.2. Альтернативная нотация для представления строк

Иногда встречаются строки, в которых много метасимволов, например одиночных и двойных кавычек и т.д. В этом случае можно воспользоваться конструкциями %q и %Q. Вслед за ними должна идти строка, обрамленная с обеих сторон символами-ограничителями; лично я предпочитаю квадратные скобки ([]).

При этом %q ведет себя как одиночные кавычки, a %Q - как двойные.

S1 = %q[Как сказал Магритт, "Ceci n'est pas une pipe."]

s2 = %q[Это не табуляция: (\t)] # Равнозначно 'Это не табуляция: \t'

s3 = %Q[А это табуляция: (\t)]  # Равнозначно "А это табуляция: \t"

В обоих вариантах можно применять и другие ограничители, помимо квадратных скобок: круглые, фигурные, угловые скобки.

s1 = %q(Билл сказал: "Боб сказал: 'This is a string.'")

s2 = %q{Дpyгaя строка.}

s3 = %q<B этой строке есть специальные символы '" [ ] (){}.>

Допустимы также непарные ограничители. В этом качестве может выступать любой символ, кроме букв, цифр и пропусков (пробелов и им подобных), который имеет визуальное представление и не относится к числу перечисленных выше парных ограничителей.

s1 = %q:"Я думаю, что это сделала корова г-жи О'Лири," сказал он.:

s2 = %q*\r - это control-M, a \n - это control-J.*

2.3. Встроенные документы

Для представления длинной строки, занимающей несколько строк в тексте, можно, конечно, воспользоваться обычными строками в кавычках:

str = "Три девицы под окном

Пряли поздно вечерком..."

Но тогда отступ окажется частью строки.

Можно вместо этого воспользоваться встроенным документом, изначально предназначенным для многострочных фрагментов. (Идея и сам термин заимствованы из более старых языков.) Синтаксически он начинается с двух знаков <<, за которыми следует концевой маркер, нуль или более строк текста и в завершение тот же самый концевой маркер в отдельной строке:

str = <<EOF

Три девицы под окном

Пряли поздно вечерком...

EOF

Но следите внимательно, чтобы после завершающего концевого маркера не было пробелов. В текущей версии Ruby маркер в такой ситуации не распознается.

Встроенные документы могут быть вложенными. В примере ниже показано, как передать методу три представленных таким образом строки:

some_method(<<str1, <<str2, <<str3)

первый кусок

текста...

str1

второй кусок...

str2

третий кусок

текста.

str3

По умолчанию встроенный документ ведет себя как строка в двойных кавычках, то есть внутри него интерпретируются управляющие последовательности и интерполируются выражения. Но если концевой маркер заключен в одиночные кавычки, то и весь документ ведет себя как строка в одиночных кавычках:

str = <<'EOF'

Это не знак табуляции: \t

а это не символ новой строки: \n

EOF

Если концевому маркеру встроенного документа предшествует дефис, то маркер может начинаться с красной строки. При этом удаляются только пробелы из той строки, на которой расположен сам маркер, но не из предшествующих ей строк документа.

str = <<-EOF

  Каждая из этих строк

  начинается с пары

  пробелов.

  EOF

Опишу стиль, который нравится лично мне. Предположим, что определен такой метод margin:

class String

 def margin

  arr = self.split("\n") # Разбить на строки.

  arr.map! {|x| x.sub!(/\s*\|/,"")) # Удалить начальные символы.

  str = arr.join("\n") # Объединить в одну строку.

  self.replace(str) # Подменить исходную строку.

 end

end

Для ясности я включил подробные комментарии. В этом коде применяются конструкции, которые будут рассмотрены ниже как в этой, так и в последующих главах. Используется этот метод так:

str = <<end.margin