我正在学习元编程,并正在尝试制作一些 DSL 来生成 HTML。@result
实例变量没有生成正确的答案,因为在调用h1
方法时,@result
实例变量被重置。有没有一种优雅的方式来处理这些“嵌套”方法调用(我知道Ruby 在技术上没有嵌套方法)。这是我的代码:
class HtmlDsl
attr_reader :result
def initialize(&block)
instance_eval(&block)
end
private
def method_missing(name, *args, &block)
tag = name.to_s
content = args.first
@result = "<#{tag}>#{block_given? ? instance_eval(&block) : content}</#{tag}>"
end
end
html = HtmlDsl.new do
html do
head do
title 'yoyo'
end
body do
h1 'hey'
end
end
end
p html.result # => "<html><body><h1>hey</h1></body></html>"
# desired result # => "<html><head><title>yoyo</title></head><body><h1>hey</h1></body></html>"