草庐IT

Metaprogramming

全部标签

ruby - instance_eval 的 block 参数 - 记录了吗?目的?

刚刚意识到instance_eval产生self作为关联block的参数(除了1.9.2版本中的错误:http://www.ruby-forum.com/topic/189422)1.9.3p194:003>classC;end1.9.3p194:004>C.new.instance_eval{|*a|a}=>[#]1.9.3p194:005>这是否在某处记录/规范?看着ruby-doc:BasicObject,看不到提到的任何block参数。除了一些纯粹的历史原因之外,是否还有其他原因明确地传递它,而它自己总是被定义?我被这个击中的方式是:l=lambda{}myobj.instan

ruby - class << self 是什么意思?

关于:classTestclass我脑海中浮现出如下画面:因为在Ruby中一切都是对象,类本身就是类Class的对象。.调用class你打开ClassTest内部的定义并注入(inject)一些实例方法。自Test是Class的实例,您可以像在对象上调用实例方法一样调用这些方法:Test.hi.以下是有助于可视化我之前句子的伪代码:classClassdefhiputs“Hithere”endendTest=Class.new(classTestend)Test.hi我做对了吗? 最佳答案 假设我们有一个对象obj类A.此时,obj

ruby - 在模块中扩展类方法

我正在使用ruby​​的元编程功能,我发现它有点毛茸茸。我正在尝试使用模块包装方法调用。目前,我正在这样做:moduleBarmoduleClassMethodsdefwrap(method)class_evaldoold_method="wrapped_#{method}".to_symunlessrespond_to?old_methodalias_methodold_method,methoddefine_methodmethoddo|*args|sendold_method,*argsendendendendenddefself.included(base)base.exten

ruby - 将匿名类分配给常量时是否有钩子(Hook)?

我最近一直在练习一些Ruby元编程,并且想知道assigninganonymousclassestoconstants.在Ruby中,可以创建一个匿名类,如下所示:anonymous_class=Class.new#=>#可以创建此类的新实例:an_instance=anonymous_class.new#=>#:0x007f9c5afb0330>现在,当匿名类被分配给一个常量时,该类现在有了一个专有名称:Foo=anonymous_class#=>Foo之前创建的实例现在也是该类的实例:an_instance#=>#我的问题:匿名类赋值给常量的时候有没有钩子(Hook)方法?有很多h

ruby - 哪些方法可以访问源代码?

有几种方法可以从需要/加载该库的Ruby代码中访问该库的源代码。在这些方式中,有的直接读取库文件并解析。其他人通过一些内置的方法访问源代码,这些方法提供有关源代码的信息(例如抽象语法树)。在我无法直接读取文件内容的情况下(如以前的方式),访问源代码的唯一方法是访问提供信息的内置方法。通过重新定义这些方法来做其他事情,我将完全失去对源代码的访问权限。最少的方法集是什么,如果我将它们重新定义为其他东西,我将完全失去对外部文件上库源代码的访问权限?重新表述问题假设:有一个用户可以在文件A中编写任何Ruby代码。有一个我写的静态Ruby文件B,它加载了文件A并调用了A中定义的主例程,还定义了一

Ruby:如何评估每个发送命令的多个方法?

假设我有一个XML::Element...我想做类似的事情:my_xml_element.send("parent.next_sibling.next_sibling") 最佳答案 在你的情况下,最好使用instance_eval"Test".instance_eval{chop!.chop!}#=>"Te"对于您的代码:my_xml_element.instance_eval{parent.next_sibling.next_sibling} 关于Ruby:如何评估每个发送命令的多个方

ruby - 在 Ruby 中覆盖方法调用?

我试图在调用特定类的任何方法时获得回调。覆盖“发送”不起作用。似乎send在正常的Ruby方法调用中没有被调用。举个例子。classTestdefself.items@items||=[]endend如果我们在Test上覆盖发送,然后调用Test.items,则不会调用发送。我想做的事情可行吗?我宁愿不使用set_trace_func,因为它可能会大大减慢速度。 最佳答案 使用alias或alias_method:#thecurrentimplementationofTest,definedbysomeoneelse#andfort

ruby - Ruby 的方法解除绑定(bind)机制有什么意义?

Method#unbind返回对该方法的UnboundMethod引用,稍后可以使用UnboundMethod#bind将其绑定(bind)到另一个对象.classFooattr_reader:bazdefinitialize(baz)@baz=bazendendclassBardefinitialize(baz)@baz=bazendendf=Foo.new(:test1)g=Foo.new(:test2)h=Bar.new(:test3)f.method(:baz).unbind.bind(g).call#=>:test2f.method(:baz).unbind.bind(h).

ruby - 使用 $& 全局变量的编程别名方法

我正在尝试为使用Ruby的特殊$&(returnslastregexmatch)的方法起别名。我可以手动执行此操作并且有效:original=String.instance_method(:sub)String.send(:define_method,:sub)do|*args,&block|puts"called"original.bind(self).call(*args,&block)end"foo".sub(/f/){$&.upcase}called#=>"Foo"但是,如果我尝试编写一个为我执行此操作的方法,它会失败:defprogramatic_alias(klass,me

ruby - 我怎样才能将这段代码转换为元编程,这样我就可以停止复制它了?

我有一个用于building.netsystemswithruby/rake的小但不断增长的框架,我已经研究了一段时间了。在此代码库中,我有以下内容:require'rake/tasklib'defassemblyinfo(name=:assemblyinfo,*args,&block)Albacore::AssemblyInfoTask.new(name,*args,&block)endmoduleAlbacoreclassAssemblyInfoTask此代码遵循的模式在框架中重复了大约20次。每个版本的区别在于正在创建/调用的类的名称(而不是AssemblyInfoTask,它可