PStore是Stdlib中的一个数据序列化器,它是人类可读的,如JSON或YAML。
所有事情都必须在“交易”中完成,例如
storage = PStore.new("db")
storage.transaction do |db|
db[:key] = {}
db[:key][:sub_key] = "val"
return db[:key][:sub_key]
end
# ==> "val"
我希望能够制作这样的方法:
def store(storage, list_of_keys, value)
storage.transaction do |db|
db[list_of_keys[0][list_of_keys[1]][list_of_keys[n]] = value
end
end
从概念上讲,我认为currying在这里很有用,但我只是在Javascript中完成。
在这样的变量中存储对中间值的引用似乎不起作用:
storage.transaction do |db|
db_val_1 = db[keys[0]]
db_val_1 = value
end
答案 0 :(得分:1)
我不知道你想要什么。但我的猜测是你想在给定的键列表的嵌套哈希中存储一个值。既然它是嵌套的,我会使用,显然是一个哈希。以下是我认为您尝试做的完整工作代码:
require 'pstore'
require 'minitest/autorun'
storage = PStore.new("data_file.pstore")
def nest(key_list, value)
reverse_key_list = key_list.reverse
inner_most = {"#{reverse_key_list.shift}" => value}
reverse_key_list.reduce(inner_most) {|acc, current| {"#{current}" => acc }}
end
def nested_store(storage, key_list, value)
root = key_list.shift
data = nest(key_list, value)
storage.transaction { storage[root] = data }
end
describe "pstore test" do
before do
@key_list = %w(root sub1 sub2 sub3)
@val = "value"
end
it "should nest the list" do
nest(@key_list, @val).must_equal({"root" => {"sub1" => {"sub2" => {"sub3" => "value" }}}})
end
it "store the nested list" do
storage = PStore.new("data_file.pstore")
nested_store(storage, @key_list, @val)
storage.transaction do
storage["root"]["sub1"]["sub2"]["sub3"].must_equal "value"
end
end
end