Рубиновый хэш с ленивыми ключами - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть коллекция «конечных точек данных».Каждая конечная точка имеет имя и может быть доступной или недоступной.В Ruby я хочу представить доступные конечные точки в виде хэша, чтобы с ними было легко работать.Сложность состоит в том, что получение информации о конечных точках является дорогостоящим и должно выполняться лениво.

Некоторые примеры того, как я хочу, чтобы мой объект вел себя:

endpoints = get_endpoints.call        # No endpoint information is accessed yet
result = endpoints['name1']           # This should only query endpoint "name1"
is_available = endpoints.key? 'name2' # This should only query endpoint "name2"
all_available = endpoints.keys        # This has to query all endpoints

Комментарии описывают внутреннюю структуру объектаделает запросы к «конечным точкам данных».

Это просто просто , чтобы создать хэш, который может выполнять первые 2 строки.Однако я не знаю, как поддержать последние 2 строки.Для этого мне нужен способ сделать ключи ленивыми, а не только значения.

Спасибо, что взглянули!

1 Ответ

0 голосов
/ 22 ноября 2018

Вы должны переопределить метод key? и выполнить свою собственную проверку там.

class LazyHash < Hash
  def key?(key)
    # Do your checking here. However that looks for your application
  end
end

По-моему, вы все же напрашиваетесь на неприятности.Одним из самых сильных достоинств в информатике является ожидаемость.Если вы изменяете поведение чего-либо, изменяете его далеко за пределы его намерения, это не поможет вам продолжать называть это оригинальным именем.Вам не нужно вводить свое решение в существующие классы / интерфейсы.

Программирование предлагает вам большую гибкость, поэтому вы можете делать такие вещи (в зависимости от языка, конечно,), но в этом же аргументе у вас нет причин не просто создавать новый объект / сервис с собственным API.

Я рекомендую начать с нового класса заново и создать желаемый интерфейс и функциональность.

class LazyEndpoints
  def on?(name)

  end

  def set(name, value)

  end
end

(Или что-то в этом роде, мир за вами!)

...