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



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

我有这个方法,它将对象作为参数。

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。请注意,这些是示例值,实现可能没有意义问题I,但重要的是理解我遇到的问题。

这就是我将如何使用该函数:

common_attributes(MyModule::Myclass)
common_attributes(MyModule::DifferentClass)
common_attributes(MyModule::AnotherDifferentClass)

我将如何确保接受较少参数的另一个类收到所需的参数并省略它不需要的参数?

注意 我无法编辑类以包含可选参数。

您应该在方法中测试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

检查可以根据需要增加以涵盖更多特殊情况。

也许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

相关内容

  • 没有找到相关文章

最新更新