rstdという趣味ライブラリを作っています

はじめに

この記事は Ruby Advent Calendar2 2021の12/6の記事です。

qiita.com

二年くらい前から趣味で作っているrstdというライブラリの紹介したいと思い、参加しました。

作っているもの

rtsdという「標準ライブラリにあると便利そうなメソッド」をRefinementsを使って実装しているライブラリを作っています。

github.com

きっかけ

Array#both_endというメソッドをbugs.ruby-langで提案したのが切っ掛けで作り始めました。

bugs.ruby-lang.org

挙動としては以下のような感じで動くと良いのではと考えてました。

# 通常のArray
ary = [ "w", "x", "y", "z" ]
ary.both_end     #=> ["w", "z"]
ary.both_end(2)  #=> [["w", "x"], ["y", "z"]

# 空のArray
[].both_end    #=> [nil, nil]
[].both_end    #=> [nil, nil]

提案したところコミッターの卜部さんから「Why not start as a gem? There are things not possible without core changes, but it seems this requested feature needs no such things.」とコメントがあり、gemで実装もできるしやってみるかとなりrtsdを作り始めました。

モチベーションなど

基本的に気の向いたときに実装をしたり、CIのメンテナンスしたりとかな感じです。 なので、一時コミットが全くなかったり……。

最近は少しずつ暇を見つけてはアレコレ便利そうなメソッドを追加したりしてます。

最終的にどういうものにしたいとか明確な目標はないですが、少なくとも「自分が使ってて便利そうなメソッドを追加する」という方針だけは維持してゆるく作りたいと思ってます。

使い方

rtsdは以下のようにrequireした後に、使用したいメソッドを定義しているModuleusingするだけです。

require "rstd"

using Rstd::RefineInteger

41.inc
# => 42

個人的に気に入っているメソッドなど

Array#has?

Array#has?は以下のような配列内に引数で渡した値があるかをチェックしてくれるメソッドです。 既に標準ライブラリではArray#include?がありますが、もう少し短く書きたかったので追加した感じです。

require 'rtsd'

using Rstd::RefineArray

ary = [1, 2, 3, 4, 5]

ary.has?(1)
# => true

ary.has?(117)
# => false

Hash#has_pair?

Hash#has_pair?は特定のキーとバリューの組み合わせを持っているかをチェックするメソッドですね。 Hash#has_key?Hash#has_value?を組み合わせて書いても良いんですが、毎回書くのも面倒だなと思い、追加しています。

require 'rstd'

using Rstd::RefineHash

hash = {jhon: 'S-117', linda: 'S-058', fred: 'S-104', kelly: 'S-104'}

hash.has_pair?(:jhon, 'S-117')
# => true

has.has_pair?(:daisy, 'S-023')
# => false

Kernel.#refine_method

Kernel.#refine_methodはクラス内でブロックとRefinementsを使って、良い感じにその場でメソッドを追加したいので実装してみました。

require 'rstd'

using Rstd::RefineKernel

using refine_method(Integer, :halo) do
  p 'Master Chief is came back!'
end

42.halo
# => 'Master Chief is came back!'

こんな感じで書けるので個人的には一番良く使っています。

おわりに

簡単ですが、趣味で作っているライブラリを紹介させていただきました。 今後、色々便利メソッドとか実装してみて標準にもあると嬉しいなというものがあれば提案していきたいと思います。