From 1c9e12b96fd066351716b3cefa15321204c235d0 Mon Sep 17 00:00:00 2001 From: jbranchaud Date: Mon, 9 Dec 2024 22:11:08 -0600 Subject: [PATCH] Add Disable Interpolation For A Heredoc String as a Ruby TIL --- README.md | 3 +- ...able-interpolation-for-a-heredoc-string.md | 41 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 ruby/disable-interpolation-for-a-heredoc-string.md diff --git a/README.md b/README.md index adba594..8f07383 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ pairing with smart people at Hashrocket. For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186). -_1532 TILs and counting..._ +_1533 TILs and counting..._ --- @@ -1223,6 +1223,7 @@ _1532 TILs and counting..._ - [Define Multiline Strings With Heredocs](ruby/define-multiline-strings-with-heredocs.md) - [Destructure The First Item From An Array](ruby/destructure-the-first-item-from-an-array.md) - [Destructuring Arrays In Blocks](ruby/destructuring-arrays-in-blocks.md) +- [Disable Interpolation For A Heredoc String](ruby/disable-interpolation-for-a-heredoc-string.md) - [Disassemble Some Codes](ruby/disassemble-some-codes.md) - [Double Splat To Merge Hashes](ruby/double-splat-to-merge-hashes.md) - [Edit Previous Parts Of The Pry Buffer History](ruby/edit-previous-parts-of-the-pry-buffer-history.md) diff --git a/ruby/disable-interpolation-for-a-heredoc-string.md b/ruby/disable-interpolation-for-a-heredoc-string.md new file mode 100644 index 0000000..114d946 --- /dev/null +++ b/ruby/disable-interpolation-for-a-heredoc-string.md @@ -0,0 +1,41 @@ +# Disable Interpolation For A Heredoc String + +As a matter of convenience, a heredoc performs string interpolation by default. + +Here is an example of that. + +```ruby +irb(main):087> word = 'taco' +=> "taco" +irb(main):088" puts <<-TEXT +irb(main):089" I want to eat a #{word}! +irb(main):090> TEXT + I want to eat a taco! +=> nil +``` + +A much less common scenario is that we don't want string interpolation to take +place. For whatever reason, we want the exact string to be preserved. To +achieve that, we can wrap the opening heredoc identifier in single quotes. + +As you can see, the `#{word}` portion is preserved. + +```ruby +irb(main):091> word = 'taco' +=> "taco" +irb(main):092' puts <<-'TEXT' +irb(main):093' I want to eat a #{word}! +irb(main):094> TEXT + I want to eat a #{word}! +=> nil +``` + +This syntax puts the heredoc in single-quote mode. I left the IRB line preamble +in for each codeblock so that you can see the difference. The first example +(lines 88 and 89) shows the heredoc is double-quoted. The second example (lines +92 and 93) shows the heredoc is single quoted. + +Note: the closing heredoc identifier (`TEXT` in this case) is not wrapped in +single quotes, just the opening one. + +[source](https://ruby-doc.org/3.3.6/syntax/literals_rdoc.html#label-Here+Document+Literals)