Каков пример использования методов цитирования %q / %Q Ruby?


Я читал через Программирование Томаса Ruby 1.9 и наткнулся на альтернативные методы с разделенными одиночными и двойными кавычками (%q / %Q). Я также знал о них из других ссылок на язык Ruby.

%q/I'm acting like a single-quoted string/

%Q|"I'm acting like a double-quoted string" --Anonymous|

Я не работал с Руби долго, но у меня есть никогда столкнулся с этим методом цитирования в производственном коде.

кроме очевидной способности избегайте внутреннего экранирования кавычек с обратными косыми чертами, что являются ли распространенными случаи использования этого метода цитирования по обычным одинарным или двойным кавычкам? Они обычно используются в однострочных или многострочных строках? Если они используются в многострочных строках, они когда-либо предпочитались строкам HEREDOC? Есть ли определенная идиома Ruby, где они обычно встречаются?

5 70

5 ответов:

они чрезвычайно полезны для экранирования HTML с JavaScript в нем, где вы уже "исчерпали" методы цитирования:

link = %q[<a href="javascript:method('call')">link</a>]

Я также нашел их очень полезными при работе с многострочными инструкциями SQL:

execute(%Q[
  INSERT INTO table_a (column_a)
    SELECT value
      FROM table_b
      WHERE key='value'
])

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

Ruby предоставляет другие удобные методы, такие как %r который может создавать регулярные выражения. Это позволяет избежать slash-itis при попытке написать тот, который обрабатывает такие вещи, как http:// что в противном случае пришлось бы сбежал.

обзор

помимо "избегайте внутренних кавычек" и примеров, ранее предоставленных @tadman, есть и другие варианты использования:

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

подробности

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

помимо примеров, уже приведенных @tadman, существует общий случай генерации кода, когда генерируемый код имеет тот же или по существу аналогичный синтаксис, что и код генерирующей программы.

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

посмотреть примеры этого, не стесняйтесь взглянуть на следующие ссылки.

ссылки

[ см., например,

]

возможно, стоит отметить, что %q используется bundler и jeweler по умолчанию при создании gemspecs для раздела сводки/описания gemspec. Это предотвращает использование кавычек в сводке или описании и нарушение gemspec.

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

 system(%Q(ffmpeg -y -i "#{input_filepath}" -qscale:a 2 "#{output_filepath}"))

супер удобная.

Они полезны, если ваша строка содержит одинарные или двойные кавычки. Это происходит не так часто, но техника очень полезна, когда это происходит.