0

我在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' 

什么是正确的方式从我的服务类中重载我的方法?

回答

1

对于给定的唯一名称,Ruby允许使用一种且只有一种方法,而不考虑方法签名。 Ruby解释器只查看方法的名称,而不是Java解释器,该解释器考虑参数以及方法名称。

您只能覆盖方法,给定名称的方法的最新版本优先于所有以前共享该名称的方法。

但是,您可以利用splat(*)运算符将可变数量的参数传递给数组中的方法,然后根据传递的参数数进行分支,从而避免无法重载。

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

只是简单的定义方法,按照以下:

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) 

这将工作文件。试试这个:)

相关问题