[英]How to change parametric type during instantiation in Julia
我正在尝试做以下事情
type Foo{T}
x::changeType(T)
end
函数changeType
将type参数更改为其他类型。 它不一定是函数,我很高兴使用字典或宏或w / e,我只需要一种方法来做到这一点。
我用函数和字典试了一下,都导致了错误。
我相信这不是完全可能的。 但是,您可以使用几种解决方法。
不要约束x
的类型,只需用manualy适当的类型实例化x
:
type Foo{T} x y::T end >>> f = Foo{Int32}(5.0f0, 2) Foo{Int32}(5.0f0,2) >>> typeof(fx), typeof(fy) (Float32, Int32)
您可以将对象包装在函数中:
const types = Dict(Int64 => Float32) type Foo{T} x::T end foo(k) = Foo{get(types, T, T)}
然后创建一个Foo
对象
>>> foo(Int64) Foo{Float32}
如果你想拥有相同type
混合类型字段(例如T
和map(T)
字段),你可以修改一下构造函数:
const types = Dict(Int64 => Float32) type Foo{T} x y::T Foo(x=0, y=0) = new(get(types, T, T)(x), y) end
这将允许您创建Foo
为Foo{Int64}
同时映射x
到Float32
:
>>> Foo{Int64}(5, 2) Foo{Int64}(5.0f0, 2) # x is Float32, y is Int64
而最后,也可能是最可行的一个:首先定义词典,您的包裹type
两种types
:
const types = Dict(Int64 => Float32) type Foo{T, V} x::V y::T end
现在将Foo
对象的构造包装到函数中:
foo(T) = Foo{T, get(types, T, T)} foo(T, args...) = Foo{T, get(types, T, T)}(args...)
foo
函数创建Foo
类型的对象,其中第一个参数指定Foo
的类型T
,类型V
是从types
字典中动态推断的。
>>> foo(Int64) Foo{Int64,Float32} >>> foo(Int64, 5, 2) Foo{Int64,Float32}(5.0f0,2) # x is Float32, y is Int64
注意:在上述两种方法中,如果在types
字典中没有定义T
,则get
函数返回T
,因此x
映射到T
对于不需要映射的类型,是一种回退方法。 例如,第三种选择:
>>> Foo{Int32}(5, 2)
Foo{Int32}(5,2)
x
和y
都是Int32
因为Int32
不在映射dict types
。 而对于第四种选择:
>>> foo(Int32)
Foo{Int32,Int32}
我认为目前x
的类型不能在编译时指定为T
的函数,但上述解决方法应该可以完成。
我不知道Julia编译器有多聪明..鉴于types
字典是常量,它可能会做一些聪明的事情,并从那里推断出x
的类型(也许开发人员可以回答这个问题或进一步改进)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.