0

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

我有这种将对象作为参数的方法。

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)

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

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

4

2 回答 2

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

检查可以适当增加以涵盖更多特殊情况。

于 2019-01-12T01:40:09.923 回答
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
于 2019-01-12T00:25:08.663 回答