Об использовании метода «печать» и т. Д. В ERB для метапрограммирования - PullRequest
0 голосов
/ 15 июля 2010

Я использую ERB через консоль для метапрограммирования (для математического программного обеспечения). Например, у меня есть файл test.erb, содержащий

text line before ruby
<%=  'via <%='  %>
<%  print 'print'  %>
<%  puts  'puts'   %>
text line after ruby

Когда я анализирую его по $ erb test.erb, я получаю следующий вывод

printputs
text line before ruby
via <%=


text line after ruby

Меня это не удивляет, но мне интересно, есть ли хороший способ перехватить вывод метода print и поместить его в место, где он вызывается в шаблоне ERB?

text line before ruby
via <%=
print
puts
text line after ruby

Представьте, что у меня сложная конструкция, где я предпочитаю печатать, а не собирать выходные данные в строку внутри <%= %>.


Обновление

Просто чтобы проиллюстрировать ответ Брайана:

text line before ruby
<%= '<%=' %>
% print 'print'
% puts 'puts'
% E = _erbout
% E << '_erbout'+"\n"
text line after ruby

Анализ файла $ erb test.erb:

printputs
text line before ruby
<%=
_erbout
text line after ruby

Ответы [ 2 ]

2 голосов
/ 15 июля 2010

Не уверен, поможет ли это в вашем конкретном случае, но рассмотрите некоторые примеры, используя метод _erbout

text line before ruby
<%=  'via <%='  %>
<% _erbout << 'print' %>
<% _erbout << 'puts'  %>
text line after ruby

Надеюсь, это куда-нибудь тебя приведет.

0 голосов
/ 16 июля 2010

Как вариант, можно переопределить метод Kernel#p:

файл: p_for_erb.rb

module Kernel
  alias :p_super :p

  def p *args
    if args.empty?
      @@_erbout
    elsif args.first.class == Hash
      @@_erbout = args.first[:init]
    else
      args.each { |a| @@_erbout << a }
    end
  end
end

... и затем сделайте так:

файл: mytest.erb

text before ruby
% require 'p_for_erb'
% p init: _erbout # to initialize class variable @@_erbout
% p "my p output"

Команда $ erb mytest.erb производит

text before ruby
my p output
...