不定参数
不定参数的函数也称变参函数
函数的参数可以被定义成任意个
可以在最后一个参数后紧跟省略号“...”来定义变参函数
julia> bar(x, y, z...) = (x, y, z) bar (generic function with 1 method)
对变参函数进行参数传递
julia> bar(1) ERROR: MethodError: no method matching bar(::Int64) Closest candidates are: bar(::Any, ::Any, ::Any...) at REPL[1]:1 Stacktrace: [1] top-level scope at none:0 julia> bar(1, 2) (1, 2, ()) julia> bar(1, 2, 3) (1, 2, (3,)) julia> bar(1, 2, 3, 4) (1, 2, (3, 4)) julia> bar(1, 2, 3, 4, 5) (1, 2, (3, 4, 5))
最前的两个参数 x,y 为普通的参数,需要对其进行传值,不然就报错了
变量 z 是尾随的可迭代的参数集合,其参数个数为 0 或多个,返回的是一个多元组
函数调用时,也可以使用“...”
julia> bar(x, y, z...) = (x, y, z) bar (generic function with 1 method) julia> z = (3, 4) (3, 4) julia> bar(1, 2, z...) (1, 2, (3, 4))
多元组的值完全按照变参函数的定义进行内插,也可以不完全遵守其函数定义来调用
julia> bar(x, y, z...) = (x, y, z) bar (generic function with 1 method) julia> z = (2, 3, 4) (2, 3, 4) julia> bar(1, z...) (1, 2, (3, 4)) julia> z = (1, 2, 3, 4) (1, 2, 3, 4) julia> bar(z...) (1, 2, (3, 4))
被内插的对象也可以不是多元组
julia> bar(x, y, z...) = (x, y, z) bar (generic function with 1 method) julia> z = [3, 4] 2-element Array{Int64,1}: 3 4 julia> bar(1, 2, z...) (1, 2, (3, 4)) julia> z = [2, 3, 4] 3-element Array{Int64,1}: 2 3 4 julia> bar(1, z...) (1, 2, (3, 4)) julia> z = [1, 2, 3, 4] 4-element Array{Int64,1}: 1 2 3 4 julia> bar(z...) (1, 2, (3, 4))
可选参数
函数的参数可以设置默认值
julia> function f(x, y=3) x + y end f (generic function with 2 methods) julia> f(4) 7 julia> f(4, 5) 9
定义了一个函数 f() ,有两个参数,一个是参数 x,一个是默认值为 3 的参数 y
调用该函数的时候,如果只传入一个值,则这个值赋给参数 x,参数 y 为默认值 3
如果传入两个值,则第一个值赋给参数 x,第二个值赋给参数 y,覆盖了默认值 3
关键字参数
使用关键字参数的函数,在函数签名中使用分号来定义
julia> function f(name, age; sex="male", country="jp") println(name) println(age) println(sex) println(country) end f (generic function with 1 method) julia> f("jack", 23) jack 23 male jp julia> f("jack", country="us",22, sex="female") jack 22 female us julia> f("jack", country="us", sex="female", 34) jack 34 female us
额外的关键字参数,可以像变参函数中一样,使用“...”来匹配
function f(x; y=0, args...) ### end
在函数 f 内部, args 可以是 (key,value) 多元组的集合,其中 key 是符号
可以在函数调用时使用分号来传递这个集合,如 f(x, z=1; args...),这种情况下也可以使用字典
关键字参数的默认值仅在必要的时候从左至右地传值(当对应的关键字参数没有被传递),所以默认的(关键字参数的)表达式可以调用在它之前的关键字参数
默认值的求值作用域
可选参数和关键字参数的区别在于它们的默认值是怎样被求值的
当可选的参数被求值时,只有在它之前的的参数在作用域之内
当关键字参数的默认值被计算时, 所有的参数都是在作用域之内
function f(x, a=b, b=1) ### end
在 a=b 中的 b 指的是该函数的作用域之外的 b ,而不是接下来的参数 b