带有惰性键的Ruby哈希

时间:2018-11-21 14:10:37

标签: ruby hashmap key lazy-evaluation

我有一个“数据端点”集合。每个端点都有一个名称,可以使用也可以不使用。在Ruby中,我想将可用的端点显示为Hash,以使其易于使用。困难在于获取有关端点的信息的成本很高,应该懒惰地完成。

一些我希望我的对象如何表现的例子:

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

注释描述了对象内部如何向“数据端点”发出请求。

straightforward是一个可以执行前两行的哈希。但是我不知道如何支持最后两行。为此,我需要一种使键变为惰性的方式,而不仅仅是值。

谢谢您的光临!

1 个答案:

答案 0 :(得分:0)

您必须重写key?方法,并在那里进行自己的检查。

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

在我看来,您是在自找麻烦。可预期性是计算机科学中最强大的优点之一。如果要更改某事物的行为,对其进行远远超出其意图的修改,则它不能使您继续使用原始名称进行调用。您无需将解决方案引入现有的类/接口中。

编程为您提供了很大的灵活性,因此您可以 做这样的事情(当然取决于语言),但是在同一论点中,您没有理由不简单地构建一个新对象/ service使用自己的API。

我建议从一个新的类重新开始,并建立所需的界面和功能。

class LazyEndpoints
  def on?(name)

  end

  def set(name, value)

  end
end

(或类似的东西,世界就是你的生命!)