尝试重载方法时获取“错误的参数数量”

时间:2016-11-02 02:40:23

标签: ruby-on-rails ruby-on-rails-4 overloading

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

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

2 个答案:

答案 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)

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