在另一个函数

时间:2016-09-13 07:30:49

标签: ruby

在我的模块中,我定义了两个函数具有相同名称不同数量的参数

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

在另一个Ruby文件中,我通过以下方式调用doTask

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

但我得到运行时错误:

unknown keyword: career (ArgumentError)

为什么?

2 个答案:

答案 0 :(得分: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')

答案 1 :(得分:2)

Ruby不支持方法重载(具有相同名称和不同参数的2个方法),因此使用career参数的第二个方法定义是替换第一个方法定义。

您可以为可选参数提供默认值,如下所示:

def self.doTask(name:, age:, career: 'Employee')
 puts "name:#{name}, age:#{age}, career:#{career}"
end
如果没有指定,

然后career将具有值“Employee”。

或默认为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中Ruby中不存在等效行为。