在我的模块中,我定义了两个函数具有相同名称但不同数量的参数。
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)
为什么?
答案 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中不存在等效行为。