0

我正在尝试使用此代码以通用方式将各种功能排入队列:

{ Object.const_get(object_name).new(job[:params]||={}).delay(:queue => queue).send(method_name)}

job是一个哈希,我在其中获取名称、对象参数等...

我的问题是在这种情况下:

class Foo
  def initialize
    puts 'bar'
  end
end

Foo实例化不带参数。

因此,如果我将前一行与Fooas一起使用,object_name我将收到此错误:

ArgumentError: wrong number pf arguments (1 for 0)

我绝对不想写这样的东西:

if job.has_key?[:param] then
  Object.const_get(object_name).new(job[:params]||={}).delay(:queue => queue).send(method_name)
else
  Object.const_get(object_name).new().delay(:queue => queue).send(method_name)
end

我可以写什么来代替job[:params]||={}它适用于每种情况?

提前致谢。

4

3 回答 3

1

initialize您的类的方法Foo应该接收具有默认值的参数。像这样:

class Foo
  def initialize(params={})
    # Here you do stuff like checking if params is empty or whatever.
  end
end

这样,您将实现这两​​种行为。

于 2013-08-07T18:37:30.977 回答
1

您可以通过使用 Foo.send 和使用数组来实现这一点。

例如

Object.
  const_get(object_name).
  send(*(job.has_key?(:param) ? ['new', job[:param]] : ['new']))...

我个人认为这是不值得的,而且if陈述更容易让人眼前一亮。

于 2013-08-07T18:51:56.933 回答
0

根据您的示例,我认为您接受的测试可能是错误的。您的代码建议您不应该测试 :params 键是否存在于哈希中,您应该测试 initialize 是否接受参数。如果 initialize 确实接受了一个参数,那么无论哈希中是否存在 :params 键,您都向它发送一个参数。当散列中不存在 :params 键时,接受的答案将失败,但初始化方法需要一个参数——你会得到一个 0 对 1 的错误。有这种可能吗?

class Dog
  def initialize(params)
    p params
    puts "dog"
  end
end

class Cat
  def initialize
    puts "cat"
  end
end

class_names = ["Dog", "Cat"]

job = {
  params: {a: 1, b: 2, c: 3}
}

class_names.each do |class_name|
  class_obj = Object.const_get(class_name)

  if class_obj.instance_method(:initialize).arity == 0
    send_args = 'new'
  else
    send_args = 'new', job[:params] ||= {}
  end

  class_obj.send(*send_args)
end

--output:--
{:a=>1, :b=>2, :c=>3}
dog
cat
于 2013-08-07T19:26:18.037 回答