Ruby Programming/Alternate quotes

← Strings | Here documents →


In Ruby, there's more than one way to quote a string literal. Much of this will look familiar to Perl programmers.

These alternative methods are:

  • single quotes with the %q operator: %q(abc) is the same as 'abc'
  • double quotes with the %Q operator: %Q(abc's) is the same as "abc's"

Alternate single quotes

edit

Let's say we are using single quotes to print out the following path.

puts 'c:\bus schedules\napolean\the portland bus schedule.txt'

This will result in the following output:

c:\bus schedules\napolean\the portland bus schedule.txt

The single quotes keep the \b, \n, and \t from being treated as escape sequences (the same cannot be said for wikibooks' syntax highlighting).

Now let's consider the following string literal:

puts 'c:\napolean\'s bus schedules\tomorrow\'s bus schedule.txt'

This outputs:

c:\napolean's bus schedules\tomorrow's bus schedule.txt

Escaping the apostrophes makes the code less readable and makes it less obvious what will print out.

Luckily, in Ruby, there's a better way. You can use the %q operator to apply single-quoting rules, and choose your own delimiter. This delimiter will mark the beginning and end of the string literal.

puts %q!c:\napolean's documents\tomorrow's bus schedule.txt!
puts %q/c:\napolean's documents\tomorrow's bus schedule.txt/
puts %q^c:\napolean's documents\tomorrow's bus schedule.txt^
puts %q(c:\napolean's documents\tomorrow's bus schedule.txt)
puts %q{c:\napolean's documents\tomorrow's bus schedule.txt}
puts %q<c:\napolean's documents\tomorrow's bus schedule.txt>

Each line will print out the same text:

c:\napolean's documents\tomorrow's bus schedule.txt

You can use any punctuation you want as a delimiter, not just the ones listed in the example.

Of course, if your chosen delimiter appears inside of the string literal, then you need to escape it.

puts %q#c:\napolean's documents\tomorrow's \#9 bus schedule.txt#

If you use matching braces to delimit the text, however, you can nest braces, without escaping them.

puts %q(c:\napolean's documents\the (bus) schedule.txt)
puts %q{c:\napolean's documents\the {bus} schedule.txt}
puts %q<c:\napolean's documents\the <bus> schedule.txt>

Alternate double quotes

edit

The %Q operator (notice the case of Q in %Q) allows you to create a string literal using double-quoting rules, but without using the double quote as a delimiter. It works much the same as the %q operator.

 print %Q^Say:\tHello world\n\tHello world\n^
 print %Q(Say:\tHello world\n\tHello world\n)

Just like double quotes, you can interpolate Ruby code inside of these string literals.

 name = 'Charlie Brown'
 
 puts %Q!Say "Hello," #{name}.!
 puts %Q/What is "4 plus 5"? Answer: #{4+5}/