我想创建一个函数向量。如果vector有多个元素,则可以正常工作:
[mean, sum]
2-element Vector{Function}:
mean (generic function with 95 methods)
sum (generic function with 30 methods)
这里的类型是Vector
,元素类型是Function
。
但如果vector只有一个元素,则会发生以下情况:
[mean]
1-element Vector{typeof(mean)}:
mean (generic function with 95 methods)
突然变成元素类型为typeof(mean)
的Vector
。这是一个错误,还是我不够聪明,不明白这一点?
Julia中的Function
是一个抽象类型:
julia> isabstracttype(Function)
true
对于给定函数foo
调用typeof(foo)
返回一个具体类型:
julia> dump(typeof(mean))
typeof(mean) <: Function
由于typeof(foo)
返回的是具体类型,因此可以得到以下类型的并集向量:
julia> Union{typeof(mean), typeof(sum)}[mean, sum]
2-element Vector{Union{typeof(sum), typeof(mean)}}:
mean (generic function with 8 methods)
sum (generic function with 20 methods)
这也意味着您可以创建这样的空Vector
:
v = Vector{Union{typeof(mean), typeof(sum)}}()
Union{typeof(sum), typeof(mean)}[]
,现在你可以给它添加元素:
julia> push!(v,mean)
1-element Vector{Union{typeof(sum), typeof(mean)}}:
mean (generic function with 8 methods)
julia> push!(v,sum)
2-element Vector{Union{typeof(sum), typeof(mean)}}:
mean (generic function with 8 methods)
sum (generic function with 20 methods)
当你只做[mean, sum]
时,Julia试图找到一个同时捕获typeof(mean)
和typeof(sum)
的类型,你最终得到抽象的Function
类型。
对于一个函数,我们说mean
,它的类型只是typeof(mean)
,故事就结束了。因此,当矢量中只有mean
时,Julia会尝试使用最特定的类型。当你有两个不同的函数时,除了抽象类型Function
之外,没有其他更常见的类型了,因此Julia会退回到这个类型。
类似于:
julia> [1]
1-element Vector{Int64}:
1
julia> [1, "blah"]
2-element Vector{Any}:
1
"blah"
您可以创建空Vector{Function}并将函数压入其中,或者追加!另一个指向它的函数向量:
using Statistics
funcs = Vector{Function}()
push!(funcs, mean)
push!(funcs, sum)
append!(funcs, [minimum, maximum])
println(funcs)