我有一堂有一些方法的课。这是超级秘密,但我已经在这里复制了我能做到的。
Class RayGun
# flashes red light
# requires confirmation
# makes "zowowowowowow" sound
def stun!
# ...
end
# flashes blue light
# does not require confirmation
# makes "trrrtrtrtrrtrtrtrtrtrtr" sound
def freeze!
# ...
end
# doesn't flash any lights
# does not require confirmation
# makes Windows startup sound
def killoblast!
# ...
end
end
我希望能够在运行时向类询问其中一种方法并接收哈希或结构,如下所示:
{:lights => 'red', :confirmation => false, :sound => 'windows'}
这样做的最佳方法是什么?显然,您可以将单独的 YAML 文件放在旁边并设置一个约定来将两者联系起来,但理想情况下,我希望将代码和元数据放在一个地方。
我能想到的最有前途的想法是这样的:
class RayGun
cattr_accessor :metadata
def self.register_method(hsh)
define_method(hsh.name, hsh.block)
metadata[hsh[:name]] = hsh
end
register_method({
:name => 'stun!',
:lights => 'red',
:confirmation => 'true',
:sound => 'zowowo',
:block => Proc.new do
# code goes here
})
# etc.
end
有人有更好的想法吗?我在吠叫一棵非常错误的树吗?