繁体   English   中英

如何在Julia实例化期间更改参数类型

[英]How to change parametric type during instantiation in Julia

我正在尝试做以下事情

type Foo{T}
  x::changeType(T)
end

函数changeType将type参数更改为其他类型。 它不一定是函数,我很高兴使用字典或宏或w / e,我只需要一种方法来做到这一点。

我用函数和字典试了一下,都导致了错误。

我相信这不是完全可能的。 但是,您可以使用几种解决方法。

  1. 不要约束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) 
  2. 您可以将对象包装在函数中:

     const types = Dict(Int64 => Float32) type Foo{T} x::T end foo(k) = Foo{get(types, T, T)} 

    然后创建一个Foo对象

     >>> foo(Int64) Foo{Float32} 
  3. 如果你想拥有相同type混合类型字段(例如Tmap(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 

    这将允许您创建FooFoo{Int64}同时映射xFloat32

     >>> Foo{Int64}(5, 2) Foo{Int64}(5.0f0, 2) # x is Float32, y is Int64 
  4. 而最后,也可能是最可行的一个:首先定义词典,您的包裹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)

xy都是Int32因为Int32不在映射dict types 而对于第四种选择:

>>> foo(Int32)
Foo{Int32,Int32}

我认为目前x的类型不能在编译时指定为T的函数,但上述解决方法应该可以完成。

我不知道Julia编译器有多聪明..鉴于types字典是常量,它可能会做一些聪明的事情,并从那里推断出x的类型(也许开发人员可以回答这个问题或进一步改进)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM