メソッドの代わりにラムダ/プロシージャを使用すると、次のことができます。
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
します。クロージャーを使用すると、ローカル変数を含む環境がキャプチャされるため、それに書き込むことができます。