我正在努力理解朱莉娅中的参数类型创建。我知道我可以使用以下内容创建一个类型:
type EconData
values
dates::Array{Date}
colnames::Array{ASCIIString}
function EconData(values, dates, colnames)
if size(values, 1) != size(dates, 1)
error("Date/data dimension mismatch.")
end
if size(values, 2) != size(colnames, 2)
error("Name/data dimension mismatch.")
end
new(values, dates, colnames)
end
end
ed1 = EconData([1;2;3], [Date(2014,1), Date(2014,2), Date(2014,3)], ["series"])
但是,我无法弄清楚如何指定values
的输入方式。我做一些像
type EconData{T}
values::Array{T}
...
function EconData(values::Array{T}, dates, colnames)
...
然而,这(和类似的尝试)只是产生和错误:
ERROR: `EconData{T}` has no method matching EconData{T}(::Array{Int64,1}, ::Array{Date,1}, ::Array{ASCIIString,2})
如何指定values
的类型?
答案 0 :(得分:6)
答案是things get funky with parametric types and inner constructors - 事实上,我认为这可能是朱莉娅最令人困惑的事情。直接的解决方案是提供合适的外部构造函数:
using Dates
type EconData{T}
values::Vector{T}
dates::Array{Date}
colnames::Array{ASCIIString}
function EconData(values, dates, colnames)
if size(values, 1) != size(dates, 1)
error("Date/data dimension mismatch.")
end
if size(values, 2) != size(colnames, 2)
error("Name/data dimension mismatch.")
end
new(values, dates, colnames)
end
end
EconData{T}(v::Vector{T},d,n) = EconData{T}(v,d,n)
ed1 = EconData([1,2,3], [Date(2014,1), Date(2014,2), Date(2014,3)], ["series"])
还有什么办法可以完成
ed1 = EconData{Int}([1,2,3], [Date(2014,1), Date(2014,2), Date(2014,3)], ["series"])
我的解释可能是错误的,但我认为可能是默认情况下没有参数类型构造函数方法,所以你必须为类型的特定实例化(我的第二个版本)调用构造函数或添加外部构造函数你自己(第一版)。
其他一些评论:你应该明确维度。即如果您的所有字段都是向量(1D),请使用Vector{T}
或Array{T,1}
,如果它们是矩阵(2D),请使用Matrix{T}
或Array{T,2}
。如果需要,可以在尺寸上使其参数化。如果不这样做,可能会生成慢速代码,因为使用此类型的函数在运行时之前并不确定实际的数据结构,因此会进行大量检查。