gpt4 book ai didi

ruby - 如何在没有 alias_method_chain 的情况下装饰 Ruby 中的方法

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

我们都知道,如果目标类是由模块组成的,你可以在新模块中调用super。但是如果它是一个类中的普通方法呢?

class Logger
def message(msg)
puts msg
end
end

比如说,Logger 是一个我无法更改的类(例如,它在 gem 中)。我希望 Logger 在每条消息之前放置一个“================”行。我如何以美丽的方式做到这一点?遗产?聚合?怎么办?

最佳答案

您可以将原始方法保存为未绑定(bind)的方法对象,而不是将其保存在别名中。

然后,您可以对 block 使用define_method。该 block 将在闭包中捕获未绑定(bind)的 method_object,允许您在新方法中使用它,而不会污染您的模块/类。

唯一的缺点是,您可能无法以这种方式定义产生或接受 block 的方法:

module Mod
unbound_method = instance_method(:original_method)
define_method :original_method do |*args|
#do something before
#call the original method
unbound_method.bind(self).call(*args)
#do something after
end
end

关于ruby - 如何在没有 alias_method_chain 的情况下装饰 Ruby 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4353346/

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