在python中:
import redis
db = redis.StrictRedis()
db.set({'test1': 'a', 'test2' : 'b'},1)
print db.get({'test2': 'b', 'test1' : 'a'})
result : 1
我怎么能用红宝石做呢?(我不想使用json,因为在json中,散列中元素的顺序必须很强。)
最佳答案
这可能是可能的,但并不像python中那样直截了当。这是因为键将以字符串形式转换,但不会有任何特定的规范化。因此,如果交换键的位置,则字符串表示形式将更改。
2.1.5 :001 > r = Redis.current
=> #<Redis client v3.2.1 for redis://127.0.0.1:6379/0>
2.1.5 :002 > r.set({test1: 'a', test2: 'b'}, 1)
=> "OK"
2.1.5 :003 > r.keys
=> ["{:test1=>\"a\", :test2=>\"b\"}"]
2.1.5 :004 > r.get({test2: 'b', test1: 'a'})
=> nil
此外,在ruby中,hash可以用键作为字符串或符号进行映射,从而返回不同的表示形式。
如果要将散列用作符号,需要做的是首先对其应用规范化函数。例如:
def to_key(hash)
hash.to_a.sort.map { |pair| "%s:%s" % pair }.join("/")
end
会改变的
{test2: 'b', test1: 'a'}
{test1: 'a', test2: 'b'}
{"test1" => 'a', "test2" => 'b'}
...
进入之内
"test1:a/test2:b"
这可以有效地用作密钥。