在Ruby中,您可以引用字符串中的变量,并在运行时进行插值.
例如,如果声明一个变量foo
equals "Ted"
并声明一个"Hello, #{foo}"
它插入的字符串"Hello, Ted"
.
我无法弄清楚如何对"#{}"
从文件读取的数据执行魔术插值.
在伪代码中,它可能看起来像这样:
interpolated_string = File.new('myfile.txt').read.interpolate
但是最后interpolate
一种方法不存在.
我认为这可能是在Ruby 1.9.x中执行所需操作的最简单,最安全的方法(sprintf不支持1.8.x中的名称引用):使用"按名称引用"的Kernel.sprintf功能.例:
>> 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."
好吧,我是第二个stesch在这种情况下使用erb的答案.但你可以像这样使用eval.如果data.txt包含内容:
he #{foo} he
然后你可以像这样加载和插值:
str = File.read("data.txt") foo = 3 result = eval("\"" + str + "\"")
而且result
将是:
"he 3 he"
您可以使用而不是插值erb
.这篇博客给出了ERB使用的简单示例,
require 'erb' name = "Rasmus" template_string = "My name is <%= name %>" template = ERB.new template_string puts template.result # prints "My name is Rasmus"
Kernel#eval
也可以用.但大多数时候你想要使用简单的模板系统erb
.
您可以使用IO.read(filename)将文件读入字符串,然后将结果用作格式字符串(http://www.ruby-doc.org/core-2.0/String.html#method-i- 25):
myfile.txt文件:
My name is %{firstname} %{lastname} and I am here to talk about %{subject} today.
fill_in_name.rb:
sentence = IO.read('myfile.txt') % { :firstname => 'Joe', :lastname => 'Schmoe', :subject => 'file interpolation' } puts sentence
在终端运行"ruby fill_in_name.rb"的结果:
My name is Joe Schmoe and I am here to talk about file interpolation today.
Ruby Facets提供了一个String#interpolate方法:
插.提供一种外部使用Ruby字符串插值机制的方法.
try = "hello" str = "\#{try}!!!" String.interpolate{ str } #=> "hello!!!"
注意:块必要,以便然后绑定调用者.
已经给出了两个最明显的答案,但是如果由于某些原因他们不这样做,那就是格式运算符:
>> x = 1 => 1 >> File.read('temp') % ["#{x}", 'saddle'] => "The number of horses is 1, where each horse has a saddle\n"
而不是#{}魔法你有更老的(但经过时间考验)%s魔法...