Julia 中的函数的含义和作用都与数学中的定义比较贴近。你还记得定义函数的那种简洁形式吗?如:
这与数学中定义函数的方式是多么的相似啊!不过,这个名叫的函数并不是一个纯粹的函数。因为它有副作用,会向标准输出打印内容。
Julia 虽然允许函数拥有副作用,但是它有一个非常好的惯用法,同时也是一项很值得遵从的编程最佳实践,那就是:拥有副作用的函数的名称会以!
为后缀。反过来说,名称不以!
为后缀的函数就不会有副作用。因此,函数名称中的!
也就成为了一种标志。它向我们表明了当前函数的特殊行为方式。我们在之前已经介绍过不少这样的函数,如:append!
、broadcast!
、delete!
、get!
、merge!
、,等等。
另一方面,Julia 函数的用途是很广泛的。Julia 中的大多数操作符都是由函数实现的,只不过它们支持了某些特殊的语法罢了。我们在前面的章节中使用过的操作符+
、-
、*
、/
,以及==
和===
等等,其实都是函数。例如,在 Julia 的标准库中定义了这样一个名称为的函数:
这个函数会被应用在两个浮点数相加的操作当中:
可以看到,不论是1.2 + 2.3
还是+(1.2, 2.3)
,它们使用的实际上都是同一种操作方式。
这里需要明确一下,我们确实可以把前面那个名称为+
的定义笼统地称为函数定义。但是,确切地说,它定义的是一个衍生方法,而且是基于泛化函数+
的且针对于Float64
类型的参数的衍生方法。
你应该已经对衍生方法这个概念不陌生了。我们在前面几章中都有所提及,而且还一起编写过几个简单的衍生方法。不过,我在本章的后面还会对衍生方法进行一次系统化的阐释,以便让你能够深入地理解它们。
下面,我们先从基本的函数编写方式讲起。