代码之家  ›  专栏  ›  技术社区  ›  Andy

关于在erb中使用“print”等方法进行元编程

  •  0
  • Andy  · 技术社区  · 14 年前

    我通过控制台使用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 回复  |  直到 14 年前
        1
  •  2
  •   Brian    14 年前

    不确定这是否对您的特定情况有帮助,但请考虑使用erbout方法查看一些示例

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

    希望这能让你有所收获。

        2
  •  0
  •   Andy    14 年前

    作为一种选择,我们可以重新定义 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