2016-12-22 1 views
1

У меня есть класс Container, который имеет атрибут type, который хранит тип элемента, хранящегося в нем:Установить атрибут «класса» типа, чтобы определить его как Int32, String, Float64

class Container 

    def initialize(@type = Class) 

    end 

end 

И я хочу чтобы использовать его как это:

array = Container.new(Int32) 
# or 
array = Container.new(String) 

Однако при запуске этого я получаю: can't use Class as the type of instance variable @dtype of Crystalla::Ndarray, use a more specific type

Как я могу добиться этого? Если я смотрю на других языках и librairies как NumPy, они хранят тип в своих ndarrays:

np.ndarray(shape=(2,2), dtype=float) 

Как я могу добиться чего-то подобного в кристалле?

EDIT: DTYPE является сам класс в Python, но он по-прежнему кажется, держать тип/класс, как я пытаюсь достичь

ответ

2

Я думаю, вы должны использовать дженерики для этого.

class Container(T) 
    @type : T.class 
    @array : Array(T) 

    def initialize 
    @array = Array(T).new 
    @type = T 

    puts "Container elements type is #{@type}" 
    end 
end 

array = Container(Int32).new 

конечно же экземпляра переменной @type может быть удалена, потому что вы всегда можете обратиться к T типа в определении класса.