5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【初心者必読】Ruby の誤解あるあるAdvent Calendar 2020

Day 5

gem は Ruby のライブラリーのこと,じゃない

Last updated at Posted at 2021-01-26

Ruby の初心者向け記事でしばしば

  • gem とは(Ruby の)ライブラリーのこと

という記述を見かけます。
いや,gem は確かにライブラリーなんだけども,「gem とはライブラリーのこと」と表現すると間違いです。

gem はライブラリーのなかでも,RubyGems という仕組みでパッケージされたもののことです。

ということは,そうでないライブラリーもある,ということですね。
まず,Ruby 本体に組み込まれているライブラリーがあります。これは「組込みライブラリー」と呼ばれ,この中に String,Array といったクラスや Enumerable,Comparable といったモジュールが含まれています。これらのクラス,モジュールは組込みクラス,組込みモジュールと呼ばれます。
当然 require せずに使います。gem 形式にはなっていません。

組込みクラスとは別に「標準添付ライブラリー」というものがあります。date, pathname, fileutils,csv などが該当します。
標準添付ライブラリーは,その名のとおり Ruby 本体と一緒に配布されており,インストールしなくても使えるライブラリーです。ただし,require は必要です1

標準添付ライブラリーには,gem 形式になっているものとなっていないものがあります2
Ruby のバージョンが上がるごとに標準添付ライブラリーの gem 化が進んでいます。gem 化することで,Ruby のバージョンに縛られずにライブラリーのバージョンを上げることが可能になりますので,gem 化の進展はありがたいことですね。

なお,古い Ruby でも標準添付ライブラリーに代えて gem 版を使うことができます。
例えば,Ruby 2.4 に標準添付されている csv ライブラリーは gem 形式になっていませんが,Ruby 2.4 で最新の csv gem を使うことができます。

組込みでも標準添付でもないライブラリーはどうでしょうか。
単一の Ruby スクリプトファイルを「ライブラリー」と呼んで require してもかまいませんよね。なので,ライブラリーは gem 形式でなければならない,ということはありません。
しかし,たとえ社内限定とか自分だけが使うものであっても,ライブラリーは gem 形式にすることをオススメします。バージョンや依存関係の管理,配布・保管が楽だからです。
ましてや公開して広く使ってもらうライブラリーなら gem 形式一択でしょう。

なお,RubyGems が登場する前は,ライブラリーは setup.rb というファイルを用意し,これを使ってインストールしてもらうやり方が一般的だったように思います。
この時代,RubyGems.org のようなライブラリー集積場として,RAA: Ruby Application Archive というサイトがありました。

  1. ちょっとややこしいのですが,pp ライブラリーのようにユーザーがあらわに require しなくても暗黙に require してくれるものもあります。

  2. gem 形式になっている標準添付ライブラリーは default gem と呼ばれるものと bundled gem と呼ばれるものに分けられます(誰か解説を書いてくれないかな)。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?