Array クラスの陰に隠れて存在感の薄い Set クラスですが,みなさん使ってますか?
Set クラスは文字どおり数学の「集合」を表すクラスです。標準添付ライブラリーなので(組込みではないので),require
しないと使えません。
Set の影が薄い理由は,組込みクラスでないことに加え,集合にまつわるだいたいのことが Array で代用できてしまう,ということがあると思います。
これは,Array が「大クラス主義」的に設計されていて,他言語なら分けて設計するようなさまざまなデータ型の機能を Array に詰め込んでいるからですね。
しかし,「Set は要素の重複が無いことが確実」なのに対し,Array で集合を表すと要素の重複があるかもしれないので,最後に uniq
をかます必要があったりします。
やはり集合のようなデータは Set クラスで表すのがよさそうです。
でも require
が面倒。
なのですが,どうやら Ruby 3.2 で Set が組込みクラスになるようです。
https://www.ruby-lang.org/en/news/2022/09/09/ruby-3-2-0-preview2-released/
https://bugs.ruby-lang.org/issues/16989
現在,Ruby 3.2 は 3.2.0-preview2 が出ていて,Linux や macOS の人は rbenv で気軽にこの preview2 を試すことができます。
私もこれをインストールしてやってみました:
% ruby -e "p (1..4).to_set & Set[2, 4]"
#<Set: {2, 4}>
たしかに require
無しで to_set
や Set[ ]
が使えました。
しかし,よく分からんのは,set ライブラリーって,いまは gem で提供されてるんですよね。
gem 形式の組込みクラスなんてあるの?
pp
メソッドなんかは,これもやはり gem 形式のライブラリーで提供されているのですが,呼ばれると自動的に require
されるようになっています。なので Kernel
に最初から組み込まれているかのように使えるんですよね。これと似たようなものなのかな?