Ruby 获取当前环境,丢给一个对象

linjunhalida · 2014年08月07日 · 最后由 ruohanc 回复于 2014年08月08日 · 1648 次阅读

简单地说,perform 里面会初始化环境,赋值了一堆变量, 然后里面需要动态获取一个 job,然后这个 job 会在根据这个环境,做一些事情返回。 这样的好处是把互相通过变量耦合在一起的两部分逻辑拆分开来了。

现在需要的是能够获取 perform 的内部环境,丢给 job。 下面是我的一个实现,用到了 ruby2.1 的 binding 方法,好像 2.0 里面 binding 没有 local_variable_get,郁闷。。 大家有什么别的解决方案?

实现上面,job 里面可以考虑用 b[:a], b.a,或者直接访问 a。

class Worker
  def self.perform
    a = 12
    b = 13

    job = self.get_job
    result = job.run(binding)
  end

  def self.get_job
    Job1.new
  end
end

class Job
end

class Binding
  def [](key)
    self.local_variable_get(key)
  end
end

class Job1 < Job
  def run(b)
    b[:a] * b[:b]
  end
end


puts Worker.perform

看起来就像是 sidekiq.....一端丢进去几个变量,另外一端取出来...区别不大?

#1 楼 @ruohanc 是这样的,Job.run 要在 Worker.perform 里面跑,这两块逻辑相对独立,但是 Job.run 用到 Worker.perform 里面一堆变量,传参数的话好复杂,不如直接传 binding 进去。但是 binding 的特性只是在 2.1 里面有,我不太想用,看看有没有其它的解决方案。

#2 楼 @linjunhalida 那感觉又像是 yield self 的用法?记得有些 API 是这样的,不知道在 block 里面能不能直接调变量..:

SomeClass.config do
  some_method_in_some_class some_params
end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号