如果使用的lambda /特效的代替方法然後可以:
require 'erb'
doc = <<ERB
<% input = lambda do |name, value='', type='text', size=20| %>
<input type="<%= type %>" name="<%= name %>" value="<%= value || 'e' %>" size="<%= size %>">
<% end %>
<% input["hello"] %>
<% input["HELLO", 123, 'select', 50] %>
ERB
puts ERB.new(doc, 0, '>').result
# >> <input type="text" name="hello" value="" size="20">
# >> <input type="select" name="HELLO" value="123" size="50">
的問題是,ERB(和erubis)通過解析該文件並創建另一段代碼創建這些字符串中的值內部和外部的標籤是倒置的。然後標籤之間的模板被附加到某個局部變量上。 (實際上有解決這個問題的辦法,但是你必須深入一些,我必須在以前擴展erubis來獲得我想要的替代行爲)。當您創建方法時,會更改範圍並且不再可以看到本地變量,因此它會給您一些模糊的錯誤NameError: undefined local variable or method ‘_erbout’ for main:Object
使用閉包時,會捕獲環境(包括局部變量),以便您可以寫入該環境。