给定一个类,classMyClassdefindex(arg1,arg2="hello")endend是否可以通过Class#instance_method等方法获取arg2的默认值? 最佳答案 似乎我们可以检查方法参数值的唯一方法是访问方法的binding。使用Tracepoint类,我们可以获取这样一个绑定(bind)对象,然后检查所有optional参数的值。我们需要确保只使用必需的参数调用所需的方法,以便为默认参数分配默认值。下面是我尝试这样做的-它适用于实例方法和类方法。为了调用实例方法,我们需要实例化类-如果构造函数需要
在Ruby1.9.3中,我需要创建几个类实例,每个类实例都具有相似的实例方法和类方法,但仅在几个固定参数方面有所不同。它们的类类型的区别也很重要,所以我不能简单地使用同一类的不同实例。一个简化的示例如下所示。moduleAnimalprivatedefself.make_animal(name,legs,noise)klass=Class.newklass.const_set(:NUM_LEGS,legs)klass.class.send(:define_method,:scream){noise.upcase+'!'}Animal.const_set(name,klass)endma
假设我在某处定义了一个变量和lambdaphone="1(234)567-89-01"lambda=->{gsub(/[^0-9]/,'')}如何将lambda应用于手机以获得12345678901?附言我知道我可以采用以下方法:lambda=->(arg){arg.gsub(/[^0-9]/,'')}lambda.call(phone)#=>"12345678901"但我想保持简洁。 最佳答案 你可以使用BasicObject#instance_exec:phone.instance_exec&lambda#=>"12345678
我刚刚进入ruby世界,我需要帮助。假设b是nil。我希望以下代码返回nil而不是“NoMethodError:undefinedmethod”a.b.c("d").e我尝试的第一件事是重载NilClass的missing_method以简单地返回一个nil。这是我想要的行为,但我不想如此打扰。如果我能做这样的事情我会很高兴SafeNils.a.b.c("d").e所以这就像一种在本地重载NilClass行为的干净方法。我很想听听一些想法或很好的资源来深入研究这个问题。只要它相当干净,我也对其他方法持开放态度。非常感谢。 最佳答案
最近我发现defined?运算符有一些奇怪的行为,用于检查super关键字是否可以在当前上下文中使用。通常它工作正常,但是当我尝试组合定义的时?super用一点元编程检查,它给了我意想不到的结果。显示比描述更容易,所以这里是一个提炼的例子来说明问题:classA;defself.def_f!;singleton_class.send(:define_method,:f){defined?super}endendclassAA(A和AA类都有.def_f!类方法)A.def_f!A.f#=>nilAA.f#=>nil(A.f没有super和AA.f调度到A.f,所以到目前为止一切正常,但
我在玩ruby元编程,我有一个问题。我有一个类:classKlassclassyeahKlass.instance_eval"@x"#=>nil为什么?在变量a中我有一个单例类,对吗?并且Klass.instance_eval在单例类的上下文中执行:Klass.instance_eval"defyeah;puts10;end"Klass.yeah#=>10此外,解释器中的Klass指向类的上下文,是吗?a指向单例类的上下文?哪个表示a.class_eval和a.instance_eval?我这样做:a.instance_eval"defpops;puts0;end"a.class_
我试图列出Controller中的实例变量但想出了irb>HomeController.instance_variable_names=>["@visible_actions","@inheritable_attributes","@controller_path","@action_methods","@_process_action_callbacks"]我在Action上试了一下irb>HomeController.action("index").instance_variable_names=>[]那么Controller实例变量属于什么? 最佳答案
我正在创建一个奇怪的类,我想在其中捕获发送到该类对象的每个方法。我可以使用method_missing实现大部分我想要的,例如classMyClassdefmethod_missingm,*args#dostuffendend接下来的问题是MyClass从Object继承的所有实例方法。我可以一个接一个地检查每个方法并重新定义它们,但我希望有一种更灵活的方法。当我尝试访问这些实例方法时,我尝试过的所有元编程方法都出现了NameError错误。 最佳答案 如@DanCheail的评论和回答所述,如果您使用的是ruby1.9+,则应
我这样做有什么区别classTdefinitializeself.class.class_evaldodeftestreturnself.class.object_idendendendend和classTdefinitializesingleton_class.class_evaldodeftestreturnself.class.object_idendendendend谢谢附言。塔斯回答说在这个例子中,singleton_class会为每一个新的对象返回不同的object_id,因为一个singleton_class只属于一个Object。但是IRB显示下一个1.9.2p180:
我正在尝试将裁剪图像所需的一些逻辑抽象到一个模块中,以免弄乱我的模型。代码基于http://railscasts.com/episodes/182-cropping-imagesmoduleCroppableImagedefcroppable_image(*image_names)image_names.eachdo|image_name|define_method"#{image_name}_sizes"do{:cropped=>read_attribute("#{image_name}_size").to_s,:large=>"800x800>"}enddefine_method"