gpt4 book ai didi

ruby - 在运行时获取/设置 Ruby 方法元数据的最佳策略是什么?

转载 作者:数据小太阳 更新时间:2023-10-29 08:35:08 26 4
gpt4 key购买 nike

我有一个包含一些方法的类。这是 supersekret,但我已经在此处复制了我能复制的内容。

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

有人有更好的想法吗?我是在大声疾呼吗?

最佳答案

我发现了另一种策略 http://github.com/wycats/thor/tree . Thor 让你可以这样写:

Class RayGun < Thor
desc "Flashes red light and makes zowowowowow sound"
method_options :confirmation => :required
def stun!
# ...
end
end

它通过使用(未记录的) Hook Module#method_added 来管理它。它是这样工作的:

  1. 调用 Thor#descThor#method_options 设置实例变量 @desc,@method_options

  2. 定义方法 stun! 调用雷神#method_added(meth)

  3. Thor#method_added 寄存器Task.new(meth.to_s, @desc,
    @method_options)
    (粗略地说)并取消设置 @desc@method_options

  4. 现在已经为下一个方法做好了准备

整洁!如此简洁以至于我要接受我自己的答案:)

关于ruby - 在运行时获取/设置 Ruby 方法元数据的最佳策略是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/443152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com