gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:06:13 25 4
gpt4 key购买 nike

我有一个名为“计算器”的模块,我想将其包含在“产品”类中。 Calculator 将扩展“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 has no method "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

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

关于ruby - 如何为类方法动态定义别名方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13408136/

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