动态定义的setter方法​​使用define_method? [英] Dynamically defined setter methods using define_method?

查看:142
本文介绍了动态定义的setter方法​​使用define_method?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用了很多迭代来定义我的模型方便的方法,这样的东西:

I use a lot of iterations to define convenience methods in my models, stuff like:

PET_NAMES.each do |pn|
define_method(pn) do
...
...
end

但我从来没有能够动态地定义setter方法​​,即:

but I've never been able to dynamically define setter methods, ie:

def pet_name=(name)
...
end

使用define_method像这样:

using define_method like so:

define_method("pet_name=(name)") do
...
end

任何想法?先谢谢了。

Any ideas? Thanks in advance.

推荐答案

下面是在你用它来扩展您的类模块使用define_method一个相当完整的例子:

Here's a fairly full example of using define_method in a module that you use to extend your class:

module VerboseSetter
    def make_verbose_setter(*names)
        names.each do |name|
            define_method("#{name}=") do |val|
                puts "@#{name} was set to #{val}"
                instance_variable_set("@#{name}", val)
            end
        end
    end
end

class Foo
    extend VerboseSetter

    make_verbose_setter :bar, :quux
end

f = Foo.new
f.bar = 5
f.quux = 10

输出:


@bar was set to 5
@quux was set to 10

您很接近,但你不希望包含的方法在你的通话 define_method 参数的参数。这些参数去传递给块 define_method

You were close, but you don't want to include the argument of the method inside the arguments of your call to define_method. The arguments go in the block you pass to define_method.

这篇关于动态定义的setter方法​​使用define_method?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆