gpt4 book ai didi

Ruby:想要一个保留顺序的类似集合的对象

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

... 或者一个防止重复条目的数组。

Ruby 中是否有某种对象:

  • 响应 []、[]= 和 <<
  • 默默地删除重复的条目
  • 是可枚举的(或至少支持 find_all)
  • 保留条目插入的顺序
?

据我所知,数组支持点 1、3 和 4;而 Set 支持 1、2 和 3(但不支持 4)。而 SortedSet 不会做,因为我的条目没有实现 <=>。

最佳答案

从 Ruby 1.9 开始,内置的 Hash 对象保留了插入顺序。例如:

h = {}
h[:z] = 1
h[:b] = 2
h[:a] = 3
h[:x] = 0
p h.keys #=> [:z, :b, :a, :x]

h.delete :b
p h.keys #=> [:z, :a, :x]

h[:b] = 1
p h.keys #=> [:z, :a, :x, :b]

因此,您可以为任何键设置任何值(如简单的 true),现在您就有了一个有序集。您可以使用 h.key?(obj) 测试键,或者,如果您始终将每个键设置为具有真值,则只需使用 h[obj]。要删除 key ,请使用 h.delete(obj)。要将有序集转换为数组,请使用 h.keys

因为 Ruby 1.9 Set library目前恰好建立在哈希之上,您目前可以使用 Set 作为有序集。 (例如,to_a 方法的实现只是 @hash.keys。)但是请注意,该库不保证此行为 ,并且可能在未来发生变化。

require 'set'
s = Set[ :f, :o, :o, :b, :a, :r ] #=> #<Set: {:f, :o, :b, :a, :r}>
s << :z #=> #<Set: {:f, :o, :b, :a, :r, :z}>
s.delete :o #=> #<Set: {:f, :b, :a, :r, :z}>
s << :o #=> #<Set: {:f, :b, :a, :r, :z, :o}>
s << :o #=> #<Set: {:f, :b, :a, :r, :z, :o}>
s << :f #=> #<Set: {:f, :b, :a, :r, :z, :o}>
s.to_a #=> [:f, :b, :a, :r, :z, :o]

关于Ruby:想要一个保留顺序的类似集合的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/773403/

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