gpt4 book ai didi

Ruby - 使用 YAML 解析哈希的字符串 - 如果哈希输入原始并强制转换为字符串而不是作为字符串输入则出错

转载 作者:数据小太阳 更新时间:2023-10-29 08:03:37 25 4
gpt4 key购买 nike

我创建了一个 gem,它将 Git 包装为键值存储(字典/哈希)。来源是here .

它在引用过程中的工作方式如下:

  1. 运行包含键和值参数的函数 set
  2. 用 git 散列这些,在散列中有关键点
  3. 如果此操作成功则返回 key 并将其添加到全局字典中 stash key 和散列

现在,如果我调用类似的东西

db.set('key', {some: 'value'})
# => 'key'

然后尝试检索它,

db.get('key')
Psych::SyntaxError: (<unknown>): did not find expected node content while parsing a flow node at line 1 column 2
from /home/bobby/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/psych.rb:370:in `parse'
from /home/bobby/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/psych.rb:370:in `parse_stream'
from /home/bobby/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/psych.rb:318:in `parse'
from /home/bobby/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/psych.rb:245:in `load'
from /home/bobby/.rvm/gems/ruby-2.2.1/gems/gkv-0.2.1/lib/gkv/database.rb:21:in `get'
from (irb):6
from /home/bobby/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'

现在,如果我将键设置为同一字典,但设置为字符串:

db.set('key', "{some: 'value'}")
# => 'key'
db.get('key')
# => {"key"=>"value"}
db.get('key').class
=> Hash

执行 git 操作并将它们包装到 kv 存储源的操作是:

...
def get(key)
if $ITEMS.keys.include? key
YAML.load(Gkv::GitFunctions.cat_file($ITEMS[key].last))
else
raise KeyError
end
end

def set(key, value)
update_items(key, value.to_s)
key
end
...

此处引用的 get_items 函数的来源是:

...    
def update_items(key, value)
if $ITEMS.keys.include? key
history = $ITEMS[key]
history << Gkv::GitFunctions.hash_object(value.to_s)
$ITEMS[key] = history
else
$ITEMS[key] = [Gkv::GitFunctions.hash_object(value.to_s)]
end
end
end
...

hash_objectcat_object 简单包装 git hash-objectgit cat-file 在一个方法中写输入到一个 tmp 文件,git add 它,然后删除该临时文件。

我真的不知道为什么这适用于字符串而不适用于真正的字典。如果您也使用旧的 hashrocket 语法,它会导致完全相同的错误:

db.set('a', {:key => 'value'})
=> "a"
db.get('a')
# => Psych::SyntaxError: (<unknown>): did not find expected node content while parsing a flow node at line 1 column 2
from /home/bobby/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/psych.rb:370:in `parse'
from /home/bobby/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/psych.rb:370:in `parse_stream'
from /home/bobby/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/psych.rb:318:in `parse'
from /home/bobby/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/psych.rb:245:in `load'
from /home/bobby/.rvm/gems/ruby-2.2.1/gems/gkv-0.2.1/lib/gkv/database.rb:21:in `get'
from (irb):6
from /home/bobby/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'

有什么想法吗?

最佳答案

在您的 get 方法中,您调用 YAML.load,但在您的 set 方法中,您使用 .to_s。这意味着 YAML 解析器正在尝试读取任意字符串,就好像它是 YAML 一样。为了对称性,YAML.dump 应该在 set 方法中使用。

我已经创建了包含更改的 pull 请求。

关于Ruby - 使用 YAML 解析哈希的字符串 - 如果哈希输入原始并强制转换为字符串而不是作为字符串输入则出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31036126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com