泛型的问题推断类型
Issue inferring type for generic
我有一个我绑定的 c
库,它有许多保存不同类型数据的结构。
@[Link("foo")]
lib LibFoo
struct IntStruct
data : LibC::Int
end
struct DoubleStruct
data : LibC::Double
end
fun get_int_struct(n : LibC::SizeT) : IntStruct*
fun get_double_struct(n : LibC::SizeT) : DoubleStruct*
end
我有一个泛型 class,我希望类型 T
成为这些结构之一的类型,基于输入数组。
class GenericClass(T)
@ptr : Pointer(T)
@obj : T
def initialize(arr : Array)
@ptr = infer_type(arr)
@obj = @ptr.value
end
end
其中 infer_type
看起来像:
def infer_type(data : Array(Int32))
return LibFoo.get_int_struct(data.size)
end
def infer_type(data : Array(Float64))
return LibFoo.get_double_struct(data.size)
end
当我明确设置类型时代码工作正常...
GenericClass(LibFoo::IntStruct).new [1, 2, 3, 4, 5]
...但我想推断类型。
也许提供自定义通用 new
方法适合您?
struct A
end
struct B
end
class Generic(T)
def self.new(items : Array(A)) forall A
new(fetch_struct(items))
end
private def initialize(@struct : T)
end
private def self.fetch_struct(items : Array(Int32))
A.new
end
private def self.fetch_struct(items : Array(Float64))
B.new
end
end
p Generic.new([1])
p Generic.new([1.0])
我有一个我绑定的 c
库,它有许多保存不同类型数据的结构。
@[Link("foo")]
lib LibFoo
struct IntStruct
data : LibC::Int
end
struct DoubleStruct
data : LibC::Double
end
fun get_int_struct(n : LibC::SizeT) : IntStruct*
fun get_double_struct(n : LibC::SizeT) : DoubleStruct*
end
我有一个泛型 class,我希望类型 T
成为这些结构之一的类型,基于输入数组。
class GenericClass(T)
@ptr : Pointer(T)
@obj : T
def initialize(arr : Array)
@ptr = infer_type(arr)
@obj = @ptr.value
end
end
其中 infer_type
看起来像:
def infer_type(data : Array(Int32))
return LibFoo.get_int_struct(data.size)
end
def infer_type(data : Array(Float64))
return LibFoo.get_double_struct(data.size)
end
当我明确设置类型时代码工作正常...
GenericClass(LibFoo::IntStruct).new [1, 2, 3, 4, 5]
...但我想推断类型。
也许提供自定义通用 new
方法适合您?
struct A
end
struct B
end
class Generic(T)
def self.new(items : Array(A)) forall A
new(fetch_struct(items))
end
private def initialize(@struct : T)
end
private def self.fetch_struct(items : Array(Int32))
A.new
end
private def self.fetch_struct(items : Array(Float64))
B.new
end
end
p Generic.new([1])
p Generic.new([1.0])