ruby - "#{ }"表示法与 erb 表示法

标签 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

下面的大多数答案似乎都假设 "#{ }" 出现一次不会跨越多行,因此不能嵌入像循环多行这样的代码块。但为什么不呢?如果你这样做,我看不出与使用 <% > 有什么不同。 , 除了在后者你把 <% >在每一行。

最佳答案

你是对的,你的 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 代码插入字符串的标准方法是在字符串文字中使用 #{}。这是内置于语言级别(相对于级别)。

关于ruby - "#{ }"表示法与 erb 表示法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5616950/

相关文章:

ruby-on-rails - 将附加参数传递给 Controller

ruby - 执行 ruby​​ 时更改终端大小

string - Go 中没有开头、结尾的函数?

c# - 如何检查是否可以在 C# 中使用另一个字符串的字符获取一个字符串?

c++ - 有人可以帮助我处理 C++ 模板中的嵌套名称说明符吗?

java - 选择合适的模板引擎

c++ - 模板数据结构 - 访问从抽象类派生的模板类的 getter 和 setter

ruby - 在 Ruby 中按哈希分组

javascript - 对具有多个值的字符串使用 Includes 方法

ruby-on-rails - ruby rails : Use Variable in link_to helper path