Я работаю над Ruby Gem for creating presentations, и я хотел бы создать синтаксис для определения слайдов, который прост и интуитивно понятен. Я использую instance_eval
, поэтому я могу вызывать методы самостоятельно. Вот что я изначально планировал сделать:Почему я не могу переопределить метод * в Ruby?
slide {
title 'What is Ruby?'
* 'a programming language'
* 'with lots of interpreters'
* 'lots of fun!'
}
Даже если я определил метод *
, я получаю ошибку:
in `instance_eval': ... syntax error, unexpected '\n', expecting :: or '[' or '.' (SyntaxError)
Я скомпрометирован, создав короткий метод, называемый b
для создания пуль , но это не так хорошо:
slide {
title 'What is Ruby?'
b 'a programming language'
b 'with lots of interpreters'
b 'lots of fun!'
}
Это просто ограничение переводчика? Или есть способ обойти это?
Update: Если вы хотите, вы можете выкопать в full source code, но вот небольшой пример того, как это реализовано:
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
Предоставленная вами информация не достаточно, чтобы сказать причину ошибки. – sawa
* Как вы это определили? Вы можете * легко определить *, но это оператор, так что это зависит от того, как вы его определили и как работает ваша DSL. –
Я просто добавил обновление с образцом исходного кода – Andrew