【问题标题】:Getting "wrong number of arguments" when trying to overload method尝试重载方法时获得“错误数量的参数”
【发布时间】:2016-11-02 02:40:23
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      只需简单地定义你的方法如下:

      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)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-18
        • 2016-05-08
        • 2016-11-10
        • 1970-01-01
        • 1970-01-01
        • 2020-02-10
        • 2022-08-17
        • 1970-01-01
        相关资源
        最近更新 更多