5

最初のいくつかの要素を何度も取り出して削除したい要素のセットがあります。これよりも短い方法 (2 つではなく 1 つの操作) はありますか?

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を見落としているかどうか疑問に思っています)

4

4 に答える 4

5

take!Set クラスに新しいメソッド(または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}>
于 2013-01-30T17:04:53.250 に答える
3

組み込みメソッドを使用するより短い方法はありません。

1 つの要素を返したり削除したりするメソッドに対する未解決の機能要求があります。API の改良に協力していただけませんか?

于 2013-01-30T20:28:41.253 に答える
1

http://www.ruby-doc.org/stdlib-1.9.3/libdoc/set/rdoc/Set.htmlから:

Set は、重複のない順序付けられていない値のコレクションを実装します。これは、Array の直感的な相互操作機能と Hash の高速ルックアップのハイブリッドです。

indexについて何も知らないオブジェクトに shift や pop などのメソッドを実装するのは奇妙で、おそらく非論理的です。

于 2013-01-30T15:06:45.163 に答える
0

私はパーティーに遅れましたが、これが私の解決策です。最初にセットを配列に変換すると、すべての 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}>
于 2014-12-16T20:21:35.753 に答える