为什么我不能覆盖Ruby中的*方法?
我正在研究
Ruby Gem for creating presentations,我想创建一种用于定义简单直观的幻灯片的语法.我正在使用instance_eval,所以我可以在self上调用方法.这是我原本打算做的事情:
slide { title 'What is Ruby?' * 'a programming language' * 'with lots of interpreters' * 'lots of fun!' } 即使我已经定义了一个*方法,我也得到了错误:
我已经通过创建一个名为b的简短方法来创建子弹,但它不是很好: slide { title 'What is Ruby?' b 'a programming language' b 'with lots of interpreters' b 'lots of fun!' } 这仅仅是翻译的限制吗?或者有办法解决它吗? 更新:如果您愿意,可以深入了解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 解决方法
事实并非如此.你可以这样做: class Dog private def do_stuff(arg) puts 2 + arg end end d = Dog.new d.instance_eval do do_stuff(3) end --output:-- 5 > instance_eval()将self更改为其接收者,在这种情况下为d. 现在,如果将方法的名称从do_stuff更改为*: class Dog private def *(arg) puts 2 + arg end end d = Dog.new d.instance_eval do *(3) end --output:-- 1.rb:13: syntax error,unexpected 'n',expecting tCOLON2 or '[' or '.' 所以op依赖于正常的方法操作,而不是归因于*的任何语法糖.在instance_eval块中,您可能希望Ruby隐式执行: self.*(3) 这相当于: d.*(3) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |