2016-09-13 2 views
0

В моем модуле я определил две функции: с таким же именем, но различное количество аргументов.Неизвестный аргумент при вызове функции в другой функции

module MyMod 
def self.doTask(name:, age:) 
    doTask(name: "John", age: 30, career: "Teacher") 
end 

def self.doTask(name:, age:, career:) 
    puts "name:#{name}, age:#{age}, career:#{career}" 
end 
end 

Как вы видите выше, в doTask, я просто называю doTask.

В другом файле Руби, я называю doTask по:

MyMod.doTask(name:"Kate", age: 28) 

Но я получаю сообщение об ошибке выполнения:

unknown keyword: career (ArgumentError) 

Почему?

+0

Когда вы вызываете метод, вы фактически передаете ему один хэш в качестве аргумента, просто чтобы вы знали. –

+1

@ sagarpandya82 no. Это аргументы ключевого слова. См. Https://robots.thoughtbot.com/ruby-2-keyword-arguments –

+0

@pascalbetz ах, спасибо. –

ответ

4

Ruby не имеет перегрузки метода. У вас не может быть нескольких методов с тем же именем.

Одним из решений было бы использовать три аргумента версии метода и добавить значение по умолчанию для аргумента :career.

module MyMod 
    def self.doTask(name:, age:, career: "Teacher") 
    puts "name:#{name}, age:#{age}, career:#{career}" 
    end 
end 
MyMod.doTask(name:"Kate", age: 28) 
MyMod.doTask(name:"Kate", age: 28, career: 'Teacher') 
MyMod.doTask(name:"Kate", age: 28, career: 'Mechanic') 
+0

Не могли бы вы предоставить некоторый код, чтобы быть понятным? Спасибо –

+0

@ Leem.fin обновлен. –

+0

приятно! именно то, что я хочу. Благодарю. –

2

Рубин не поддерживает перегрузку методов (2 методы с тем же именем и различными параметрами), поэтому ваше второе определение метода с career параметра заменяющего первое определение метода.

Вы можете указать значение по умолчанию для дополнительного параметра, как это:

def self.doTask(name:, age:, career: 'Employee') 
puts "name:#{name}, age:#{age}, career:#{career}" 
end 

, а затем career будет иметь значение «Сотрудник», если не указано.

или по умолчанию nil и включают в себя некоторую логику в теле метода для обработки

def self.doTask(name:, age:, career: nil) 
    unless career.nil? 
    # doTask with career 
    else 
    # doTask without career 
    end 
end 

Если вы пришли к Руби из другого языка, как Java или C#, то есть некоторое большое понимание, почему эквивалентное поведение Безразлично Существует в Ruby в this answer.

+0

Ага, приятно знать. Благодарю. –

Смежные вопросы