函数中说到,函数是从参数多元组映射到返回值的对象,若没有合适返回值则抛出异常。实际中常需要对不同类型的参数做同样的运算,例如对整数做加法、对浮点数做加法、对整数与浮点数做加法,它们都是加法。在 Julia 中,它们都属于同一对象: +
函数。
对同一概念做一系列实现时,可以逐个定义特定参数类型、个数所对应的特定函数行为。方法是对函数中某一特定的行为定义。函数中可以定义多个方法。对一个特定的参数多元组调用函数时,最匹配此参数多元组的方法被调用。
函数调用时,选取调用哪个方法,被称为重载。 Julia 依据参数个数、类型来进行重载。
Julia 的所有标准函数和运算符,如前面提到的 +
函数,都有许多针对各种参数类型组合和不同参数个数而定义的方法。
定义函数时,可以像复合类型中介绍的那样,使用 ::
类型断言运算符,选择性地对参数类型进行限制:
julia> f(x::Float64, y::Float64) = 2x + y;此函数中参数
x
和 y
只能是 Float64
类型:
julia> f(2.0, 3.0) 7.0如果参数是其它类型,会引发 “no method” 错误:
julia> f(2.0, 3) ERROR: `f` has no method matching f(::Float64, ::Int64) julia> f(float32(2.0), 3.0) ERROR: `f` has no method matching f(::Float32, ::Float64) julia> f(2.0, "3.0") ERROR: `f` has no method matching f(::Float64, ::ASCIIString) julia> f("2.0", "3.0") ERROR: `f` has no method matching f(::ASCIIString, ::ASCIIString)有时需要写一些通用方法,这时应声明参数为抽象类型:
julia> f(x::Number, y::Number) = 2x - y; julia> f(2.0, 3) 1.0