Как сохранить любой объект класса на карте ha sh - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть карта ha sh, которая действует как хранилище объектов - где ключ - это имя класса, а значение - это объект

store = {} of String => Type 

store["Animal"]= Animal.new
store["Book"]= Book.new
store["Car"]= Car.new

Здесь класс мне неизвестен, что означает, что я не могу использовать союзный тип. Подскажите пожалуйста, как решить эту проблему?

Я пытаюсь создать оболочку вокруг карты sh для хранения объектов, которая будет сохранять объект и возвращать объект по ключу.

Обновление 1

Классы будут переданы в качестве параметра - как это

add_in_store(Animal)
add_in_store(Person)

Обновление 2

Кристаллическая ссылка воспроизведения того, что я пытаюсь do - https://play.crystal-lang.org/# / r / 8lwx

Решение проблемы не должно быть таким же, как то, что я делаю. Это может быть любой другой подход, например, использование pro c или macro et c.

.

1 Ответ

1 голос
/ 22 февраля 2020

Hash - это тип generi c, чтобы обернуть его таким образом, чтобы вы не могли или не хотели ограничивать возможные типы аргументов generi c, вам следует сделать саму оболочку generi c.

class Store(V)
  @store = {} of String => V 

  def add(name, value : V)
    @store[name] = value 
  end 
end 

Тогда потребитель вашей обертки должен указать возможные типы.

...