我正在尝试执行以下操作
type Foo{T}
x::changeType(T)
end
函数 changeType
将类型参数更改为其他类型。它不一定是一个函数,我很乐意使用字典或宏或 w/e,我只需要一种方法来做到这一点。
我用函数和字典都尝试过,但都导致了错误。
最佳答案
我认为这不是完全可能的。但是,您可以尝试一些解决方法。
不要限制
x
的类型,只需手动将x
实例化为正确的类型即可:type Foo{T} x y::T end >>> f = Foo{Int32}(5.0f0, 2) Foo{Int32}(5.0f0,2) >>> typeof(f.x), typeof(f.y) (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
这将允许您在将
x
映射到Float32
时将Foo
创建为Foo{Int64}
:>>> 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
不在映射字典 types
。对于第四个选项:
>>> foo(Int32)
Foo{Int32,Int32}
我认为目前 x
的类型不能在编译时指定为 T
的函数,但上述解决方法应该可以完成这项工作。
我也不知道 Julia 编译器有多聪明..鉴于 types
字典是常量,它可能会做一些聪明的事情并推断出 x
从那里(也许开发人员可以回答这个问题或提供进一步的改进)。
关于types - 如何在 Julia 实例化期间更改参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36639887/