我如何处理红宝石中的对象等功能?

时间:2016-10-22 14:35:08

标签: ruby

在我的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来推送函数并调用它们。

其他解决方案也很受欢迎,但我不想避免学习将函数作为参数传递,将它们放在数组中并调用它们。

感谢。

3 个答案:

答案 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_0func_1。要使用数组迭代调用它们,您可以执行此操作

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