我有一组元素,我想从中取出并多次删除前几个元素。有没有比这更短的方法(所以一个操作而不是两个)来做到这一点:
require 'set'
s = Set[1, 2, 3, 4] # => #<Set: {1, 2, 3, 4}>
first_two = s.take(2) # => [1, 2]
s.subtract(first_two) # => #<Set: {3, 4}>
(所以基本上我想知道我是否忽略了一个shift
for Sets)
您可以向 Set 类添加一个新方法take!
(或remove!
任何合适的名称):
class Set
def take!(args)
taken = self.take(args)
self.subtract(taken)
return taken
end
end
a = Set[1, 2, 3, 4] # <Set: {1, 2, 3, 4}>
a.take!(2) # <Set: {1, 2}>
a # <Set: {3, 4}>
使用内置方法没有更短的方法。
对于返回和删除一个元素的方法有一个开放的功能请求;您可能想帮助改进 API?
来自http://www.ruby-doc.org/stdlib-1.9.3/libdoc/set/rdoc/Set.html:
Set 实现了一组无重复的无序值。这是 Array 的直观互操作设施和 Hash 的快速查找的混合体。
在对index一无所知的对象上实现 shift 和 pop 之类的方法会很奇怪,而且可能不合逻辑。
我迟到了,但这是我的解决方案。先将集合转换为数组,然后所有的 Enumerable 方法都可用。从阵列中取出 2,然后确保也从集合中移除 2。集合中的两个值被删除并返回。
require 'set'
s = Set[1, 2, 3, 4] # => #<Set: {1, 2, 3, 4}>
first_two = s.to_a.take(2).tap {|a| s.subtract(a)} # => [1, 2]
s # => #<Set: {3, 4}>