在PStore

时间:2015-08-11 07:16:44

标签: ruby

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

1 个答案:

答案 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