没关系,它们都是一样的。erb是纯红宝石,eruby是用C写的,所以速度快一点。
Erubis(第三种)是纯红宝石,比上面列出的两种都快。但我怀疑它的速度对你来说是瓶颈,所以使用erb。它是Ruby标准库的一部分。
eruby和erb的区别是什么?是什么因素驱使我选择其中一个?
我的应用程序正在为网络设备(路由器、负载平衡器、防火墙等)生成配置文件。我的计划是将配置文件模板化,在源文件中使用嵌入式ruby(通过eruby或erb)来做一些事情,比如迭代生成路由器的所有接口配置块(这些块都非常相似,只是在标签和IP地址上有不同)。例如,我可能有一个这样的配置模板文件:
hostname sample-router
<%=
r = String.new;
[
['GigabitEthernet1/1', '10.5.16.1'],
['GigabitEthernet1/2', '10.5.17.1'],
['GigabitEthernet1/3', '10.5.18.1']
].each { |tuple|
r << 'interface #{tuple[0]}
'
r << ' ip address #{tuple[1]} netmask 255.255.255.0
'
}
r.chomp
%>
logging 10.5.16.26
当它通过嵌入式ruby解释器(erb或eruby)运行时,会产生以下输出:
hostname sample-router
interface GigabitEthernet1/1
ip address 10.5.16.1 netmask 255.255.255.0
interface GigabitEthernet1/2
ip address 10.5.17.1 netmask 255.255.255.0
interface GigabitEthernet1/3
ip address 10.5.18.1 netmask 255.255.255.0
logging 10.5.16.26
我正在使用erb做类似的事情,性能对我来说很好。
正如Jordi所说,这取决于您想要在什么上下文中运行它——如果您确实要使用您列出的模板,eruby可能会更好,但我猜您实际上是要将变量传递给模板,在这种情况下您需要erb。
仅供参考,当使用erb时,你需要将你想从中获取变量的对象的绑定传递给它,就像这样:
device = Device.new
device.add_interface("GigabitEthernet1/1", "10.5.16.1")
device.add_interface("GigabitEthernet1/2", "10.5.17.1")
template = File.read("/path/to/your/template.erb")
config = ERB.new(template).result(device.binding)