0

Я использую Rails 4.2.7 на Ubuntu 14.04. В соответствии с этим - 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) 

это будет работать файл. попробуйте это :)