“#{}”符号与erb表示法

时间:2011-04-11 05:03:55

标签: ruby string templates eval erb

符号之间有什么区别:

"
  some text
  #{some_ruby_code}
  some text
  #{some_more_ruby_code}
  some_other_text
"

ERB.new("
  some text
  <%=some_ruby_code%>
  some text
  <%=some_more_ruby_code%>
  some_other_text
").result

我只是有一个广泛的印象,即erb符号可能更强大,但不是那么清楚。你能从不同方面比较它们,并告诉哪些应该在什么样的场合使用?什么样的事情可以用一种符号而不是另一种符号来做?

添加1

到目前为止,大多数答案似乎都声称erb效率低下,并且在"#{ }"可以使用时不应该使用。现在,让我们问另一种方式。为什么"#{ }"符号不能代替erb?会不会更快更好?

添加2

下面的大多数答案似乎都假设"#{ }"的单个出现不会跨越多行,因此无法嵌入像一个采用多行的循环的代码块。但为什么不呢?如果您这样做,我认为与使用<% >执行此操作没有任何区别,除了在后者中您将<% >放在每一行中。

3 个答案:

答案 0 :(得分:5)

你的ERB版本应该产生与正常版本相同的结果(我认为),你是对的,但它的目的完全不同。

ERB实际上仅用于模板化:如果您需要生成文本(如HTML页面或文档),某些模板引擎(如ERB)将是正确的工具。然而,它不适用于简单的字符串插值:虽然它确实能够做到这一点,但它是一种相当周边的方式来实现它。实际上,您实际上是从字符串创建ERB对象,然后将其评估回​​字符串。

通过快速基准测试,您可以了解这是多么低效:

$ irb -rbenchmark -rerb
ruby-1.9.2-p136 :023 > Benchmark.bm do |bm|
ruby-1.9.2-p136 :024 >     bm.report 'interpolation' do
ruby-1.9.2-p136 :025 >       a = 'hello there'
ruby-1.9.2-p136 :026?>     5000.times { "well #{a}" }
ruby-1.9.2-p136 :027?>     end
ruby-1.9.2-p136 :028?>   bm.report 'erb' do
ruby-1.9.2-p136 :029 >       a = 'hello there'
ruby-1.9.2-p136 :030?>     5000.times { ERB.new("well <%= a %>").result(binding) }
ruby-1.9.2-p136 :031?>     end
ruby-1.9.2-p136 :032?>   end
      user     system      total        real
interpolation  0.000000   0.000000   0.000000 (  0.001495)
erb  0.340000   0.000000   0.340000 (  0.352098)
 => true 

将Ruby代码插入字符串的标准方法是在字符串文字中使用#{}。它内置于语言级别(而不是级别)。

答案 1 :(得分:4)

ERB的优点:

  1. 每个人都已经知道并“喜欢”那种类似PHP的风格
  2. 您无需担心平衡或转义'"
  3. 通常你不需要编写底层的Ruby机制,也就是说,你不需要定义一个方法,可能位于一个类中,可能用模块限定等等......
  4. 总体而言,我认为总体思路是将软件开发人员需要完成的程序部分与前端Web开发人员可以完成的部分分开。例如,软件开发人员可以简单地指定@account_number可用,并且可以由没有Ruby资格的HTMLers引用。

    在现实生活中,似乎有很多单人项目,但至少在一次时,常规就是让团队处于典型问题。即使在今天,也可以从开发人员那里查看所有Rails问题,这些开发人员显然几乎不知道任何Ruby。 ERB早于Rails,所以如果你回到机制的起源,有一段时间你真的总是需要一个真正的软件部门,因为每个项目都涉及组建一个框架,所以你可能不想要求Ruby软件的资格来自团队中的每一位成员。

    现在,我确实看到了你的意思。如果你已经了解Ruby,那么证明这种错误是非常困难的。

答案 2 :(得分:1)

尝试将ERB用于一般字符串插值的一个缺点是ERB实际上旨在生成HTML。结果将是许多编码问题,当你忘记了所有的东西,并对你的&符号,大于,小于等符号被破坏的原因感到困惑。

我认为ERB的计算开销也会增加,但这可能无关紧要。

此外,如果你在Ruby中放入内联的ERB,最终会在Ruby内部使用Ruby内部的ERB(当你在ERB中调用方法时可能会更多级别),这将是一个令人困惑的混乱。想想那些必须维护你的代码的可怜的灵魂,说可怜的灵魂甚至可能是你。

更新:您可以将#{}用于简单的HTML模板(请参阅Mustache了解类似的内容)但是生成重复的部分会很困难而且很难看。重复的部分在HTML模板中很常见,因此对于HTML模板系统来说应该是简单而自然的。使用ERB,您可以:

<% a.each do |e| %>
    <!-- ... -->
<% end %>

#{}插值会很麻烦。你最终也会#{html(blahblah)}一直在做,大多数人都会忘记。

此外,“#”在URL中具有特殊含义,在CSS中具有不同的特殊含义(其中大括号也具有特殊含义);片段URL和CSS块在HTML模板中相当常见,所以你总是担心混淆。当使用#{}在URL中生成CSS选择器或片段但这足以使其变得麻烦时,这种特殊的肮脏可能只是一个问题。

相关问题