创建类的实例时有条件地传递参数

时间:2019-01-11 23:48:37

标签: ruby ruby-2.4

我正在重构代码,我想在创建类实例时将一些逻辑传递给参数。为了最好地描述问题,我将分享一些代码。

我有这种方法,它以一个对象作为参数。

def common_attributes(klass)
  klass.new(id: some_id, name: some_name, role_id: some_role.id)
end

我希望能够使用它来做类似的事情:

def common_attributes(klass)
  klass.new(id: some_id,
            name: some_name
            role_id: some_role.id unless Module::class)
end

这是因为我的模块中有几个类。这些类中的两个采用相同的三个参数,即idnamerole_id。另一个类带有两个参数idname。请注意,这些只是示例值,实现可能对我没有什么意义,但重要的是要了解我的问题。

这就是我使用该功能的方式:

common_attributes(MyModule::Myclass)

common_attributes(MyModule::DifferentClass)

common_attributes(MyModule::AnotherDifferentClass)

我如何确保另一个使用较少参数的类接收必需的参数,而忽略不需要的参数?

NB 我无法编辑这些类以包含可选参数。

2 个答案:

答案 0 :(得分:1)

您应该在方法中测试klass的类。例如,如果仅接受两个属性的类为MyModule::Myclass,而其他所有内容都接受树属性,则以下两种解决方案均应起作用:

def common_attributes(klass)
  case klass
  when MyModule::Myclass
    klass.new(id: some_id, name: some_name)
  else
    klass.new(id: some_id, name: some_name, role_id: some_role.id)
  end
end

或:

def common_attributes(klass)
  options = { id: some_id, name: some_name }

  if klass.is_a?(MyModule::Myclass)
    options[:role_id] = some_role.id
  end

  klass.new(**options)
end

支票可能会增加,以覆盖更多特殊情况。

答案 1 :(得分:0)

也许您正在寻找arity

def common_attributes(klass)
  args = { id: some_id, name: some_name }
  args[:role_id] = some_role.id if klass.instance_method(:initialize).arity == 3
  klass.new args                
end
相关问题