我正在尝试使用“method_missing”格式化标签,我想要的结果如下所示。
<foo>\n
    <bar>\n
        <ab/>\n
    </bar>\n
</foo>\n
我认为需要运行索引,但我不清楚最好把它放在哪里,或者这是否是最好的方法。我将如何添加缩进?
def method_missing(meth, *args, &block)
    if args.length > 0
        my_other_method(args)
    else
        my_method(meth.to_s, &block)
    end
end
def my_other_method(args)
    "<#{args}/>"
end
def my_method(meth)     
    s = "<#{meth}>\n"
    s << "#{_indentation}"
    s << yield.to_s << "\n"
    s << "#{_indentation}"
    s << "</#{meth}>\n"
end
def _indentation
    ("--" * _level.to_i)    # dashes added to more easily infer spacing
end
def _level
    caller.rindex {|val| val.scan('my_method')} / 3
end
p foo{bar{baz(:a => "b"){}}}
我得到这个错误的输出(不确定是什么导致了额外的 \n)
<foo>\n
--<bar>\n
----<ab>\n
----</bar>\n
\n
--</foo>\n