gpt4 book ai didi

ruby - 在类中的每个方法之前运行代码 (Ruby)

转载 作者:太空宇宙 更新时间:2023-11-03 17:05:49 26 4
gpt4 key购买 nike

我想跟踪在我构建的类的实例上运行的所有方法。

目前我这样做:

class MyClass
def initialize
@completed = []
end

# Sends a welcome and information pack to the person who requested it
def one_of_many_methods
unless @completed.include? __method__
# Do methody things
@completed.push __method__
end
end
alias :another_name :one_of_many_methods
# Calling myClassInstance.another_name will insert
# :one_of_many_methods into @completed.
# Methody things should not now be done if .another_name
# or .one_of_many_methods is called.
end

但是当我的类中有很多方法时,这会变得非常费力。我在重复自己!有没有一种方法可以跟踪被调用的方法并只允许它们被调用一次,就像我在上面所做的那样,但不必在每个方法中重复该 block ?

谢谢!

(注:我使用的是 Ruby 1.9)

最佳答案

这听起来像是 Proxy 的完美用例目的。幸运的是,Ruby 的动态特性使其实现起来非常容易:

class ExecuteOnceProxy

def initialize(obj)
@obj = obj
@completed = []
end

def method_missing(method, *args)
unless @completed.include?(method)
args.empty? ? @obj.send(method) : @obj.send(method, args)
@completed << method
end
end
end

只需在构造函数中传递原始对象即可初始化您的代理:

proxy = ExecuteOnceProxy.new(my_obj)

关于ruby - 在类中的每个方法之前运行代码 (Ruby),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6991264/

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