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

Ruby 如何为类方法动态定义别名方法?,ruby,Ruby,我有一个叫做“计算器”的模块,我想把它包含在“产品”类中。计算器将扩展“Product”,它将类方法复制到Product上。其中一个类方法是“memoize”。我的想法是我可以做这样的事情: module Calculator def self.extended(base) base.memoize :foo_bar end end 为了记忆方法(特别是类方法):foo_bar。在memoize内部,我调用了方法“alias_method”,该方法尝试将类方法别名为其他名称(此

我有一个叫做“计算器”的模块,我想把它包含在“产品”类中。计算器将扩展“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_栏调用时,alias_method行会弹出一个错误,表示产品没有方法“name”。。我的理解是,这是因为alias_方法将尝试别名实例方法而不是类方法。。(我不知道为什么,但没什么大不了的)

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

module Calculator
  def memoize(name)
    class << self
      alias_method "memoized_#{name}", name
    end
   end
end
模块计算器
def备忘录化(名称)

类所以刚刚了解到这将实现以下技巧:

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

然后,当计算器包含在产品中时,它将根据我的需要定义singleton方法。我仍然不知道为什么alias_方法只需要处理实例方法。。我也不知道为什么class\u eval或instance\u eval不能解决这个问题。。但至少我有一个解决方案。

如果将要别名的实例方法放在include/extend之前,会怎么样?如果将extend放在类名之后,那么实例方法将尚未定义

module Foo
  def self.extended(base)
    base.memoize :flavor
  end

  def memoize(name)
    alias_method "memoized_#{name}", name
  end
end

class Bar
  def flavor
    puts "Orange"
  end

  extend Foo
end

if __FILE__==$0
  b = Bar.new
  b.memoized_flavor   #=> Orange
end

虽然有一个好的想法,但实际情况并非如此,因为要进行别名化的方法在模块中进行了扩展,并在尝试进行别名化之前进行了扩展。不过想法不错。