ruby 的多索引容器
除了 ruby 之外,还有类似 boost::multi_index 的东西吗?基本上采取一些 对象的容器,并使用 N 种不同的查询方法对其进行 N 种不同的索引。
我想你可以将 DataMapper 与内存数据库中的 SQLite 一起使用,但我是 想知道周围是否有纯红宝石。
下面是此类类可能执行的操作的想象示例。看起来很 很像数据库。
class Foo
attr_accessor :a
attr_accessor :b
attr_accessor :c
end
class FooIndexer < MultiIndex
hash_index :a do |o|
o.a
end
ordered_index :b do |x, y|
x.b <=> y.b
end
end
index = FooIndexer.new
index.insert( Foo.new ( ... ))
index.insert( Foo.new ( ... ))
index.insert( Foo.new ( ... ))
index.insert( Foo.new ( ... ))
index.insert( Foo.new ( ... ))
index.find ( index.a == 10 )
index.find ( index.b > 10 )
Is there anything like boost::multi_index but for ruby. Basically taking some
container of objects and having it indexed N different ways with N different query methods.
I guess you could use DataMapper with the SQLite in memory database but I was
wondering if there is anything pure ruby around.
Below is an imagined example of what this type of class might do. It looks very
much like a database.
class Foo
attr_accessor :a
attr_accessor :b
attr_accessor :c
end
class FooIndexer < MultiIndex
hash_index :a do |o|
o.a
end
ordered_index :b do |x, y|
x.b <=> y.b
end
end
index = FooIndexer.new
index.insert( Foo.new ( ... ))
index.insert( Foo.new ( ... ))
index.insert( Foo.new ( ... ))
index.insert( Foo.new ( ... ))
index.insert( Foo.new ( ... ))
index.find ( index.a == 10 )
index.find ( index.b > 10 )
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是一个完整的解决方案,包括规格,但仅适用于
多个哈希键。
This is a fully worked solution including spec but only for
multiple hash keys.
听起来您正在寻找一种实现此功能的特定方法。但就类似 ruby 的界面而言,我建议仅使用
Enumerable#find
方法。这样,您就可以说这看起来非常像您的示例,除了大括号而不是圆括号!
稍后,如果您发现性能非常糟糕,您可能需要某种缓存或优化的
find
。但是,仅基于您的问题,如果您现在就寻找它,那么您就会优化得太早。Enumerable
已经提供了很多这样的东西,所以你有自然的扩展,比如It sounds like you're after a particular way of implementing this feature. But in terms of a ruby-like interface, I would recommend just using the
Enumerable#find
method. That way, you can saywhich looks very much like your example, save for braces instead of parentheses!
Later, if you find performance very bad, you may want to have some kind of cached or optimized
find
. But, based only on your question, if you look for that now, you'll be optimizing too soon.Enumerable
provides lots of these things already, so you have natural extensions like