gpt4 book ai didi

ruby-on-rails - hash.delete_if { |键,值| true } 不删除...为什么?

转载 作者:数据小太阳 更新时间:2023-10-29 07:51:14 26 4
gpt4 key购买 nike

我正在研究 acts_as_taggable_on 插件,但有些东西我无法真正理解(即使它只是一个非常简单的代码行)。

puts "before: " + cache.inspect# cache.delete_if { |key, value| key.id == owner.id && key.class == owner.class } # original code linecache.delete_if { |key, value| true } # my test codeputs "after: " + cache.inspect

# output
before: {#<TaggableUser id: 1, name: nil>=>["dog"]}
after: {# TaggableUser id: 1, name: nil>=>["dog"]}

我的问题是 cache.delete_if 不会删除任何内容,即使它始终评估为真。我只是不明白为什么......并且真的尝试了很多。这只是缓存哈希的问题。但我真的找不到关于那个特定哈希的任何特别之处。

缓存是在该方法中创建的:

def cached_owned_tag_list_on(context)  variable_name = "@owned_#{context}_list"  cache = instance_variable_get(variable_name) || instance_variable_set(variable_name, {})end

完整代码可以在这里查看(见第 60 行):http://github.com/mbleigh/acts-as-taggable-on/blob/master/lib/acts_as_taggable_on/acts_as_taggable_on/ownership.rb#L60

更进一步

当我执行 rehash 时在 delete_if 之前有用。什么可以以在任何删除工作之前需要重新散列的方式“破坏”散列?

最佳答案

来自rehash的文档:

 call-seq:
hsh.rehash -> hsh

Rebuilds the hash based on the current hash values for each key. If
values of key objects have changed since they were inserted, this
method will reindex <i>hsh</i>.

因此您的 key (它们是常规的 ActiveRecord 实例)的哈希值从创建之时起就发生了变化。查看 AR 来源:

# File activerecord/lib/active_record/base.rb, line 1613
1613: def hash
1614: id.hash
1615: end

因此,他们的 ID 已更改。为什么会这样?好吧,明显的原因是创建了对象,然后将其放入哈希中,然后保存(为它分配了一个 id 并更改了它的哈希)。

另外,这还有一个不好的后果:由于所有这些新创建的对象的hash都是nil的,如果有多个未保存的对象加入到hash中,它们都会占用相同的空间槽,并尝试用其他一些未保存的对象索引散列将返回无意义。

关于ruby-on-rails - hash.delete_if { |键,值| true } 不删除...为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4056849/

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