Ошибка, выводящая тип для универсального - PullRequest
0 голосов
/ 11 октября 2019

У меня есть библиотека 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

У меня есть универсальный класс, в котором я хочу, чтобы тип 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]

... но я бы хотел вывести тип.

1 Ответ

3 голосов
/ 11 октября 2019

Может быть, для вас работает специальный обобщенный 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])

https://carc.in/#/r/7s6d

...