符号之间有什么区别:
"
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/