gpt4 book ai didi

Ruby Hash 破坏性与非破坏性方法

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

找不到以前的帖子来回答我的问题...我正在学习如何在 Ruby 中使用破坏性与非破坏性方法。我找到了我正在进行的练习的答案(破坏性地向散列值添加数字),但我想弄清楚为什么我的一些早期解决方案不起作用。这是有效的答案:

  def modify_a_hash(the_hash, number_to_add_to_each_value)
the_hash.each { |k, v| the_hash[k] = v + number_to_add_to_each_value}
end

这两个解决方案以非破坏性的方式返回(因为它们都使用“每个”,所以我不明白为什么。要制造破坏性的东西是上面的等号吗?):

  def modify_a_hash(the_hash, number_to_add_to_each_value)
the_hash.each_value { |v| v + number_to_add_to_each_value}
end

def modify_a_hash(the_hash, number_to_add_to_each_value)
the_hash.each { |k, v| v + number_to_add_to_each_value}
end

最佳答案

术语“破坏性”和“非破坏性”在这里有点误导。更好的做法是使用传统的“就地修改”与“返回副本”术语。

通常就地修改的方法在其名称末尾有 ! 作为警告,例如 gsub! 用于 String。一些早于此约定的方法没有它们,例如数组的 push

= 在循环内执行赋值。您的其他示例实际上没有做任何有用的事情,因为 each 返回被迭代的原始对象,而不管产生的任何结果。

如果您想退还一份副本,您可以这样做:

def modify_a_hash(the_hash, number_to_add)
Hash[
the_hash.collect do |k, v|
[ k, v + number_to_add ]
end
]
end

那会返回一个副本。内部操作 collect 将键值对转换为应用了调整的新键值对。不需要 =,因为没有分配。

外部方法 Hash[] 将这些键值对转换为适当的 Hash 对象。然后返回并独立于原始文件。

通常,非破坏性或“返回副本”方法需要创建一个新的、独立的版本来存储结果。这适用于 String、Array、Hash 或您可能使用的任何其他类或容器。

关于Ruby Hash 破坏性与非破坏性方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25854913/

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