␡
- 2.1 Representing Ordinary Strings
- 2.2 Representing Strings with Alternate Notations
- 2.3 Using Here-Documents
- 2.4 Finding the Length of a String
- 2.5 Processing a Line at a Time
- 2.6 Processing a Byte at a Time
- 2.7 Performing Specialized String Comparisons
- 2.8 Tokenizing a String
- 2.9 Formatting a String
- 2.10 Using Strings As IO Objects
- 2.11 Controlling Uppercase and Lowercase
- 2.12 Accessing and Assigning Substrings
- 2.13 Substituting in Strings
- 2.14 Searching a String
- 2.15 Converting Between Characters and ASCII Codes
- 2.16 Implicit and Explicit Conversion
- 2.17 Appending an Item Onto a String
- 2.18 Removing Trailing Newlines and Other Characters
- 2.19 Trimming Whitespace from a String
- 2.20 Repeating Strings
- 2.21 Embedding Expressions Within Strings
- 2.22 Delayed Interpolation of Strings
- 2.23 Parsing Comma-Separated Data
- 2.24 Converting Strings to Numbers (Decimal and Otherwise)
- 2.25 Encoding and Decoding rot13 Text
- 2.26 Encrypting Strings
- 2.27 Compressing Strings
- 2.28 Counting Characters in Strings
- 2.29 Reversing a String
- 2.30 Removing Duplicate Characters
- 2.31 Removing Specific Characters
- 2.32 Printing Special Characters
- 2.33 Generating Successive Strings
- 2.34 Calculating a 32-Bit CRC
- 2.35 Calculating the MD5 Hash of a String
- 2.36 Calculating the Levenshtein Distance Between Two Strings
- 2.37 Encoding and Decoding base64 Strings
- 2.38 Encoding and Decoding Strings (uuencode/uudecode)
- 2.39 Expanding and Compressing Tab Characters
- 2.40 Wrapping Lines of Text
- 2.41 Conclusion
This chapter is from the book
2.22 Delayed Interpolation of Strings
Sometimes we might want to delay the interpolation of values into a string. There is no perfect way to do this. One way is to use a block:
str = proc {|x,y,z| "The numbers are #{x}, #{y}, and #{z}" } s1 = str.call(3,4,5) # The numbers are 3, 4, and 5 s2 = str.call(7,8,9) # The numbers are 7, 8, and 9
A more heavyweight solution is to store a single-quoted string, wrap it in double quotes, and evaluate it:
str = '#{name} is my name, and #{nation} is my nation' name, nation = "Stephen Dedalus", "Ireland" s1 = eval('"' + str + '"') # Stephen Dedalus is my name, and Ireland is my nation.
It's also possible to pass in a different binding to eval:
bind = proc do name,nation = "Gulliver Foyle", "Terra" binding end.call # Contrived example; returns binding of block's context s2 = eval('"' + str + '"',bind) # Gulliver Foyle is my name, and Terra is my nation.
The eval technique may naturally have some "gotchas" associated with it. For example, be careful with escape sequences such as \n for newline.