如何动态地为类方法定义别名方法?

2024-04-22

我有一个名为“计算器”的模块,我想将其包含在“产品”类中。计算器将扩展“Product”,它将类方法复制到 Product 上。这些类方法之一是“memoize”。我的想法是我可以做这样的事情:

module Calculator
  def self.extended(base)
    base.memoize :foo_bar
  end
end

目的是记住方法(特别是类方法):foo_bar。在 memoize 内部,我调用方法“alias_method”,该方法尝试将类方法别名为不同的名称(此处:foo_bar)。这失败了。 Memoize 看起来像这样:

module Calculator (the extended module)
  def memoize(name)
    alias_method "memoized_#{name}", name
  end
end

当通过 memoize :foo_bar 调用它时,alias_method 行会抛出一个错误,指出 Product 没有方法“name”..我的理解是这是因为 alias_method 会尝试为实例方法而不是类方法创建别名..(我不知道为什么但好吧没什么大不了的)..

我可以像这样重新打开特征类

module Calculator
  def memoize(name)
    class << self
      alias_method "memoized_#{name}", name
    end
   end
end

这可行,但名称对于类


所以刚刚了解到这可以解决问题:

module Calculator
  def memoize
    define_singleton_method(name, method(name))
  end
end

然后,当计算器包含在产品中时,它将根据我的需要定义单例方法。我仍然不知道为什么alias_method只需要在实例方法上工作..并且我不知道为什么class_eval或instance_eval没有解决问题..但至少我有一个解决方案..

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何动态地为类方法定义别名方法? 的相关文章

随机推荐