我在Ubuntu 14.04上使用Rails 4.2.7。根据这个 - Why doesn't ruby support method overloading?,如果每个方法都有不同数量的参数,我应该能够重载服务类中的方法。所以我创造了......
def create_my_object_time_obj(data_hash)
create_my_object_time_obj(data_hash, nil)
end
def create_my_object_time_obj(data_hash, my_object_id)
…
然而,当我尝试调用只接受一个参数的调用时
my_object_time = service.create_my_object_time_obj(data_hash)
我收到错误
Error during processing: wrong number of arguments (given 1, expected 2)
/Users/login/Documents/workspace/myproject/app/services/text_table_to_my_object_time_converter_service.rb:82:in `create_my_object_time_obj'
从我的服务类重载我的方法的正确方法是什么?
答案 0 :(得分:1)
Ruby允许给定唯一名称的一个且仅一个方法,而不管方法签名如何。 Ruby解释器只查看方法的名称,而不是Java解释器,它考虑参数和方法名称。
您只能覆盖方法,使用给定名称的方法的最新版本优先于以前共享该名称的所有方法。
但是,您可以通过利用splat(*)运算符向数组中的方法传递可变数量的参数,然后根据传递的参数数进行分支来解决无法重载的问题。 / p>
def foo(*args)
if args.length == 1
# logic for a single argument
elsif args.length == 2
# logic for two arguments
else
# logic for other conditions
end
end
答案 1 :(得分:0)
只需按照以下方式简单定义您的方法:
def create_my_object_time_obj(data_hash, my_object_id = nil)
create_my_object_time_obj(data_hash, my_object_id)
end
现在您可以通过单个参数调用此方法:
my_object_time = service.create_my_object_time_obj(data_hash)
这将是工作文件。试试这个:)