我认为这可能是在Ruby 1.9.x中最简单和最安全的方法(sprintf在1.8.x中不支持通过名称引用):使用Kernel.sprintf的“reference by name”特性。例如:
>> mystring = "There are %{thing1}s and %{thing2}s here."
=> "There are %{thing1}s and %{thing2}s here."
>> vars = {:thing1 => "trees", :thing2 => "houses"}
=> {:thing1=>"trees", :thing2=>"houses"}
>> mystring % vars
=> "There are trees and houses here."
require 'erb'
name = "Rasmus"
template_string = "My name is <%= name %>"
template = ERB.new template_string
puts template.result # prints "My name is Rasmus"
9条答案
按热度按时间xzabzqsa1#
我认为这可能是在Ruby 1.9.x中最简单和最安全的方法(sprintf在1.8.x中不支持通过名称引用):使用Kernel.sprintf的“reference by name”特性。例如:
drnojrws2#
好吧,我同意stesch在这种情况下使用erb的答案。但是你可以这样使用eval。如果data.txt有内容:
然后你可以像这样加载和插值:
result
将是:uelo1irk3#
可以使用
erb
代替插值。This blog给出了ERB用法的简单示例,Kernel#eval
也可以使用,但大多数情况下,您希望使用像erb
这样的简单模板系统。eeq64g8w4#
Ruby Facets提供了一个String#interpolate方法:
提供了一种扩展使用Ruby字符串插值机制的方法。
注意:为了获得调用者的绑定,这个块是必需的。
30byixjq5#
您可以使用www.example.com(filename)将文件读入字符串IO.read,然后将结果用作格式字符串(http://www.ruby-doc.org/core-2.0/String.html#method-i-25):
myfile.txt:
fill_in_name.rb:
在终端运行“ruby fill_in_name.rb”的结果:
dced5bon6#
已经给出了两个最明显的答案,但是如果他们出于某种原因不这样做,还有格式操作符:
这里的#{}魔法已被旧的(但经过时间考验的)%s魔法取代...
roejwanj7#
使用daniel-lucraft的答案作为我的基础(因为他似乎是唯一一个回答这个问题的人),我决定以一种健壮的方式解决这个问题。下面你会找到这个解决方案的代码。
对于输入
你就得到了输出
输入
将引发NameError异常。而输入
将引发ArgumentError异常,抱怨输入包含所有可用的分隔符字符。
w9apscun8#
最好把我自己的解决方案也加进去。
缺点是你想计算的表达式可能有进一步的{ },所以正则表达式可能需要改进。
jjhzyzn09#
@andrewgrimm的回答是正确的,但不完整。Facets gem有
String
扩展,包括interpolate
,这正是最初的问题所要求的。请注意
require
语句。下面是一个完整的工作示例:
显示器: