Отложенная интерполяция
Tagged:

Иногда желательно отложить интерполяцию значений в строку. Идеального ens
соба решить эту задачу не существует, но можно воспользоваться блоком:
str = proc {lx,y,z! "Числа равны #{х}, #{у) и #{z}" }
si = str.call(3,4,5) # Числа равны 3, 4 и 5.
s2 = str.call(7,8,9) # Числа равны 7, 8 и 9.
Другое, более громоздкое решение состоит в том, чтобы сохранить строку, заключенную
в одиночные кавычки, потом «обернуть» ее двойными кавычками и
вычислить:
str = '#{name) - мое имя, а #{nation} - моя родина'
name, nation = "Стивен Дедал", "Ирландия"
si = eval('"' + str + ' " 1)
# Стивен Дедал - мое имя, а Ирландия - моя родина.
Можно также передать eval другую функцию привязки:
bind = proc do
name,nation = "Гулливер Фойл", "Земля"
binding
end.call # Надуманный пример; возвращает привязанный контекст блока
s2 = eval('"' + str + '"'.bind)
# Гулливер Фойл - мое имя, а Земля - моя родина.
У техники работы с eval есть свои «причуды». Например, будьте осторожны,
5:тавляя управляющие последовательности, скажем \n.