草庐IT

Metaprogramming

全部标签

ruby - alias_method 和 class_methods 不混合?

我一直在尝试修补全局缓存模块,但我不明白为什么它不起作用。有人有什么建议吗?这是错误:NameError:undefinedmethod`get'formodule`Cache'from(irb):21:in`alias_method'...由此代码生成:moduleCachedefself.getputs"original"endendmoduleCachedefself.get_modifiedputs"Newget"endenddefpeek_a_booCache.module_evaldo#make:get_not_modifiedalias_method:get_not_mo

Ruby:在另一个方法中定义一个方法有什么实际用途吗?

我正在阅读一篇关于元编程的文章,它表明您可以在另一个方法中定义一个方法。这是我早就知道的事情,但它让我问自己一个问题:这有什么实际应用吗?在方法中定义方法是否有实际用途?例如:defouter_methoddefinner_method#...end#...end 最佳答案 我最喜欢的元编程示例是动态构建一个您将在循环中使用的方法。例如,我有一个用Ruby编写的查询引擎,其中一项操作是过滤。有许多不同形式的过滤器(子字符串、等于、=、交集等)。天真的做法是这样的:defprocess_filter(working_set,filte

Ruby 元编程,RSpec 的 'should' 是如何工作的?

我正在阅读RSpec,并试图弄清楚RSpec的“应该”是如何实现的。有人可以介绍一下这个函数的元性质是如何工作的吗?代码位于:http://github.com/dchelimsky/rspec/blob/master/lib/spec/expectations/extensions/kernel.rbTIA,-丹尼尔澄清:target.should==5target的值是如何传递给“should”的,而“should”又是“==”而不是5? 最佳答案 看看classOperatorMatcher.这一切都归结为Ruby允许您省略句

ruby - 为什么我不能在初始化中使用 attr_accessor?

我正在尝试在initialize中执行一个instance_eval,然后执行一个attr_accessor,并且我一直得到这个:``initialize':未定义的方法“attr_accessor”。为什么这不起作用?代码看起来像这样:classMyClassdefinitialize(*args)instance_eval"attr_accessor:#{sym}"endend 最佳答案 不能在实例上调用attr_accessor,因为attr_accessor没有定义为MyClass的实例方法。它仅适用于模块和类。我怀疑您想在

ruby-on-rails - Ruby - 如何在其内部获取方法名称?

这个问题在这里已经有了答案:Getthenameofthecurrentlyexecutingmethod(5个答案)关闭8年前。我正在尝试从自身获取方法名称:deffunky_methodself.inspectend它返回“main”。我怎样才能返回“funky_method”呢?

ruby - 包含模块时 __callee__ 的意外值——这是 Ruby 错误吗?

当通过alias_method创建的方法调用时,__callee__忽略旧方法的名称(此处为xxx)并返回新方法,如下:classFoodefxxx()__callee__endalias_method:foo,:xxxendFoo.new.foo#=>:foo即使xxx是从父类(superclass)继承的,这种行为仍然存在:classSupdefxxx()__callee__endendclassBar:bar鉴于以上两者,我希望当通过模块包含xxx时,同样的行为会发生。然而,事实并非如此:moduleModdefxxx()__callee__endendclassBazinclu

Ruby 元类疯狂

我卡住了。我正在尝试动态定义一个类方法,但我无法全神贯注于ruby​​元类模型。考虑以下类:classExampledefself.meta;(classClassExample.meta.class#=>ClassExample.class_instance==Example#=>trueExample.class_instance==Example.meta#=>false显然,这两种方法都返回一个Class实例。但是这两个实例不一样。他们也有不同的祖先:Example.meta.ancestors#=>[Class,Module,Object,Kernel]Example.cla

ruby - 猴子修补 vs class_eval?

classStringdefhello"world"endendString.class_eval{defworld"hello"end}"a".world=>"hello""b".hello=>"world"他们似乎在做同样的事情——向现有类添加一个方法。那有什么区别呢? 最佳答案 使用class_eval你可以做更多动态的事情:>>met="hello"#=>"hello">>String.class_eval"def#{met};'hello';end"#=>nil>>"foo".hello#=>"hello"

Ruby 嵌套发送

假设我有一个对象,它有一个访问对象的方法:deffoo@fooend我知道我可以使用send访问该方法:obj.send("foo")#Returns@foo是否有一种直接的方法来执行递归发送以获取@foo对象上的参数,例如:obj.send("foo.bar")#Returns@foo.bar 最佳答案 您可以使用instance_eval:obj.instance_eval("foo.bar")您甚至可以直接访问实例变量:obj.instance_eval("@foo.bar") 关

ruby - Ruby 中 'Know' 类名的类方法?

我希望继承的ruby​​类通过类方法“知道”它的类名。一个人为的例子最好地说明了这一点:classParentdefself.whoami??endendclassChild所以我应该可以调用:Parent.whomai并期望返回“Parent”,然后我应该可以调用:Child.whoami并期待返回“Child”我觉得在传统语言中这可能是不可能的。但Ruby的元编程模型以前曾让我惊叹。有什么想法吗?提前致谢。 最佳答案 类方法是一种方法,其中CLASS是接收者,因此要找到调用该方法的对象(您在这里似乎试图做的事情)只需检查self