2016-10-22 33 views
0

在我的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_proccall,在功能,推動並給他們打電話。

其他的解決方案也讚賞,但我不想避免學習傳遞函數作爲參數,將它們放入數組中並調用它們。

謝謝。

+0

Ruby沒有函數。你的問題不清楚。 –

回答

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 
0

假設您有方法func_0func_1。打電話給他們使用數組迭代,你可以做到這一點

methods = [:func_0, :func_1] 
methods.each do |m| 
    send(m) 
end 
+1

你不能在OP的例子中調用'send(m)',在他的情況下函數的接收者不是'self' – bjhaid

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.