我正在努力理解朱莉娅中的参数类型创建.我知道我可以使用以下内容创建一个类型:
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"])
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚如何指定values将如何键入.做我喜欢的事似乎合情合理
type EconData{T}
values::Array{T}
...
function EconData(values::Array{T}, dates, colnames)
...
Run Code Online (Sandbox Code Playgroud)
但是,这(和类似的尝试)只是产生和错误:
ERROR: `EconData{T}` has no method matching EconData{T}(::Array{Int64,1}, ::Array{Date,1}, ::Array{ASCIIString,2})
Run Code Online (Sandbox Code Playgroud)
我该如何指定类型values?
答案是,参数类型和内部构造函数的问题变得时髦 - 事实上,我认为它可能是Julia中最令人困惑的事情.直接的解决方案是提供合适的外部构造函数:
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"])
Run Code Online (Sandbox Code Playgroud)
什么也会有所作为
ed1 = EconData{Int}([1,2,3], [Date(2014,1), Date(2014,2), Date(2014,3)], ["series"])
Run Code Online (Sandbox Code Playgroud)
我的解释可能是错误的,但我认为可能是默认情况下没有参数类型构造函数方法,所以你必须为类型的特定实例化(我的第二个版本)调用构造函数或者自己添加外部构造函数(第一版).
其他一些评论:你应该明确维度.即如果您的所有字段都是向量(1D),请使用Vector{T}或Array{T,1},如果它们是矩阵(2D),则使用Matrix{T}或Array{T,2}.如果需要,可以在尺寸上使其参数化.如果不这样做,可能会生成慢代码,因为使用此类型的函数在运行时之前并不确定实际的数据结构,因此会进行大量检查.
| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |