我正在重构代码,我想在创建类实例时将一些逻辑传递给参数。为了最好地描述问题,我将分享一些代码。
我有这种方法,它以一个对象作为参数。
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
。请注意,这些只是示例值,实现可能对我没有什么意义,但重要的是要了解我的问题。
这就是我使用该功能的方式:
common_attributes(MyModule::Myclass)
common_attributes(MyModule::DifferentClass)
common_attributes(MyModule::AnotherDifferentClass)
我如何确保另一个使用较少参数的类接收必需的参数,而忽略不需要的参数?
NB 我无法编辑这些类以包含可选参数。
答案 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