对于函数来说,参数化的意义主要在于,确定其结果与其参数之间在类型约束方面的对应关系。我们下面就以之前编写的一个方法作为开始,讲解函数的参数化。我们先来回顾一下这个方法的定义。

    我们可以看到,这个函数定义对于参数的类型没有任何的限制。同时,它也没有对结果进行声明。

    在对函数进行参数化定义的时候,我们需要把where关键字以及相关的内容写在函数签名的右侧。如果函数的定义是用简洁形式编写的,那么它们还应该处于符号=的左边。

    还记得吗?我们在讲参数化类型的时候介绍过针对这种类型的值化表示法。这种表示法使用关键字来引领针对类型参数的范围约束,如Drawer{T} where T<:Jewelry。很显然,函数定义的参数化方式与之是类似的。

    同样的类型约束也可以被用在函数的结果声明上。不过,在这种情况下,我们就不能使用简洁形式去定义函数了。以下是我对前述方法进行的第二次改造:

    这一版的定义可以明确地告诉使用者,它返回的结果值会与它接受的参数值拥有相同的类型。请注意,sum3函数至此仍然只有一个衍生方法。因为 Julia 的多重分派机制并不会依据函数定义中的结果声明去识别和分辨衍生方法。这使得这一版的sum3方法覆盖掉了上一版的sum3方法。

    关于函数定义的参数化,我已经把所有的基本方式都展示在这里了。怎么样?还是很简单的吧?至于更高级的玩法,你或许可以在“参数化类型”一章里的相关内容之中找到灵感。