我正在开发用于创建演示文稿的 Ruby Gem,并且我想创建一种用于定义简单直观的幻灯片的语法。我正在使用,instance_eval
所以我可以调用自己的方法。这是我最初计划做的事情:
slide {
title 'What is Ruby?'
* 'a programming language'
* 'with lots of interpreters'
* 'lots of fun!'
}
即使我已经定义了一个*
方法,我还是得到了错误:
在 `instance_eval': ... 语法错误,意外的 '\n',期待 :: 或 '[' 或 '.' (语法错误)
我通过创建一个称为b
创建项目符号的简短方法来妥协,但它不是那么好:
slide {
title 'What is Ruby?'
b 'a programming language'
b 'with lots of interpreters'
b 'lots of fun!'
}
这只是解释器的限制吗?或者有没有办法绕过它?
更新:如果你愿意,你可以深入研究完整的源代码,但这里有一个小例子来说明它是如何实现的:
class Slide
attr_accessor :title, :bullets
end
class SlidesDSL
attr_accessor :slides
def slide
@slides ||= []
s = SlideDSL.new
s.instance_eval(&block)
@slides << s.slide
end
class SlideDSL
def slide
@slide ||= Slide.new
end
def title(text)
slide.title
end
def *(text)
bullet(text)
end
def b(text)
slide.bullets ||= []
slide.bullets << text
end
end
end
# load_slides_from_file
source = File.read(filename)
dsl = SlidesDSL.new
dsl.instance_eval(source, filename, 0)
@slides = dsl.slides