在我的ruby项目中,我想创建一个任务管理器类,它将定期迭代一系列已注册的函数。我需要将函数作为参数传递给寄存器函数,创建一个线程,当线程计时器触发时,它需要调用数组中的每个函数。
class TaskMan
@@func_array = Array.new
def self.register_func &arg_func
@@func_array.push arg_func
end
def self.run_server
loop do
@@func_array.each do |func|
func.call
end
sleep 60
end
end
end
class Callee
def self.func_0
puts "func_0 called."
end
def self.func_1
puts "func_1 called."
end
end
TaskMan.register_func Callee.func_0
TaskMan.register_func Callee.func_1
taskman_thread = Thread.new do
TaskMan.run_server
end
taskman_thread.join
基本上,这就是我想要做的,但我不确定如何使用to_proc
和call
来推送函数并调用它们。
其他解决方案也很受欢迎,但我不想避免学习将函数作为参数传递,将它们放在数组中并调用它们。
感谢。
答案 0 :(得分:2)
使用method
method将类方法作为可调用对象(在这种情况下为Method
个实例),然后将&
应用于这些对象:
TaskMan.register_func &Callee.method(:func_0)
TaskMan.register_func &Callee.method(:func_1)
现在你可以把各种各样的东西扔进func_array
:
TaskMan.register_func &SomeClass.method(:m) # class method
TaskMan.register_func &some_object.method(:m) # an instance method
TaskMan.register_func &some_lambda # a lambda function
TaskMan.register_func { puts "pancakes" } # a block
# etc.
答案 1 :(得分:1)
您可以改为传递接收器和您打算调用的函数,如下所示:
class TaskMan
@@func_array = Array.new
def self.register_func(receiver, func)
@@func_array.push([receiver, func])
end
def self.run_server
loop do
@@func_array.each do |(receiver, func)|
receiver.method(func).call
end
sleep 60
end
end
end
class Callee
def self.func_0
puts "func_0 called."
end
def self.func_1
puts "func_1 called."
end
end
TaskMan.register_func Callee, :func_0
TaskMan.register_func Callee, :func_1
taskman_thread = Thread.new do
TaskMan.run_server
end
taskman_thread.join
答案 2 :(得分:0)
假设您有方法func_0
和func_1
。要使用数组迭代调用它们,您可以执行此操作
methods = [:func_0, :func_1]
methods.each do |m|
send(m)
end