加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 23:11:27 所属栏目:百科 来源:网络整理
导读:我有一个模块可以调用“计算器”,我想要包含在“产品”类中.计算器将扩展“Product”,它将类方法复制到Product上.其中一个类方法是“memoize”.这个想法是我可以做这样的事情: module Calculator def self.extended(base) base.memoize :foo_bar endend 为
我有一个模块可以调用“计算器”,我想要包含在“产品”类中.计算器将扩展“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

这可行,但名称不适用于类的范围<<自我定义.人们已经提到过使用self.class_eval和self.instance_eval,但这些似乎都不起作用..我也喜欢我的蛋糕并且也吃它..我怎么能保持alias_method动态但是在class_methods上使用它?

解决方法

所以我才知道这会解决问题:
module Calculator
  def memoize
    define_singleton_method(name,method(name))
  end
end

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读