你能像在 C 中一样在 ruby 中定义同一个函数的多个版本吗?
例如
def meth(name, string, thing)
和
def meth(array_of_things)
ruby 会根据传入的变量调用正确的方法吗?
如果不是我怎么能做到这一点。
你能像在 C 中一样在 ruby 中定义同一个函数的多个版本吗?
例如
def meth(name, string, thing)
和
def meth(array_of_things)
ruby 会根据传入的变量调用正确的方法吗?
如果不是我怎么能做到这一点。
不,Ruby 不支持方法重载。如果你用相同的名字定义了一个方法两次,第二个定义简单地替换第一个。
为了达到相同的效果,您需要使用可变数量的参数,然后在运行时检查有多少。
取决于可能是矫枉过正的上下文。通常最好的办法就是给你的两种方法起不同的名字。
这在 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 中学到了这一点。