一、起因:match error
比如,我们有一个函数,fun(data::Dic{AbstractString,Float64},Float64) , 但是,实际上,我们传进去的参数格式是Dict{ASCIIString,Float64}类型,就会报match error.
事实上:
我们知道:
ASCIIString<:AbstractString # => true
但是:
Array{ASCIIString,1}<:Array{AbstractString,1} # =>false
Dict{ASCIIString,Float64} <: Dict{AbstractString,Float64} # => false
二、建议
所以在写函数的格式和输入格式时,一定要注意签名格式的一致,否则容易报错,而且容易一下找不出问题所在。
建议
(1) 数据入口:函数的参数的类型,尽量从宽
如, 以下函数要适用AbstractString 的可能子集做KEY, 可以更加规范一下,增加适用性。
#比如: 对weights
function indexmake{T<:AbstractString}(data::Dict{Dates.Date,Dict{AbstractString,Array{kBarData,1}}},weights::Dict{T,Float64})
# content
#
end
(2) 数据出口:对于返回类型,尽量不要返回从宽的类型,
如,
fun getData(data:Float64)
return Dict{ASCIIString,Float64}() ; # 尽量不要返回Dict{AbstractString,Float64} 类型,类型过宽。
end
另外,至于自定义类型的数据,可以从宽,问题不大.如果考虑速度,最好还是用具体类型而不是抽象类型。
type data {T<:AbstractString}
name:: T
end