0

你能像在 C 中一样在 ruby​​ 中定义同一个函数的多个版本吗?

例如

def meth(name, string, thing)

def meth(array_of_things)

ruby 会根据传入的变量调用正确的方法吗?

如果不是我怎么能做到这一点。

4

2 回答 2

4

不,Ruby 不支持方法重载。如果你用相同的名字定义了一个方法两次,第二个定义简单地替换第一个。


为了达到相同的效果,您需要使用可变数量的参数,然后在运行时检查有多少。

取决于可能是矫枉过正的上下文。通常最好的办法就是给你的两种方法起不同的名字。

于 2013-08-25T22:16:36.303 回答
3

这在 Ruby 中随处可见。有几种方法可以做到这一点。

通过使用鸭子类型,您可以执行以下操作:

def meth arg1, arg2 = nil, arg3 = nil
  if arg1.respond_to?(:some_method) then ...
  else ...
  end
end

通过参数的数量,您可以执行以下操作:

def meth *args
  case args.length
  when 3 then ...
  when 1 then ...
  end
end

通过第一个元素的类,您可以执行以下操作:

def meth *args
  case args.first
  when String then ...
  when Symbol then ...
  end
end

使用可选参数,您可以执行以下操作:

def meth arg1, arg2 = nil, arg3 = nil
  if arg2 then ...
  else ...
  end
end

我最喜欢这种做法的应用是当我有一对 setter 和 getter 方法时。当没有给出参数时,该方法作为一个 getter 工作;当给出一个参数时,它作为一个 setter 工作。例如,如果定义obj了 getter/setter 方法foo,我可以以任何一种方式使用它:

obj.foo               # as a getter
obj.foo(some_value)   # as a setter

我从 jQuery API 中学到了这一点。

于 2013-08-25T22:16:09.367 回答