我正在重构我的代码,我想在创建类的实例时将一些逻辑传递给参数。为了最好地描述这个问题,我将分享一些代码。
我有这个方法,它将对象作为参数。
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
这是因为我的模块中有几个类。其中两个类采用相同的三个参数,即id
和name
,role_id
。另一个类采用两个参数id
和name
。请注意,这些是示例值,实现可能没有意义问题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