はじめに
この記事は Ruby Advent Calendar2 2021の12/6の記事です。
二年くらい前から趣味で作っているrstd
というライブラリの紹介したいと思い、参加しました。
作っているもの
rtsd
という「標準ライブラリにあると便利そうなメソッド」をRefinementsを使って実装しているライブラリを作っています。
きっかけ
Array#both_end
というメソッドをbugs.ruby-langで提案したのが切っ掛けで作り始めました。
挙動としては以下のような感じで動くと良いのではと考えてました。
# 通常の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
した後に、使用したいメソッドを定義しているModule
をusing
するだけです。
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!'
こんな感じで書けるので個人的には一番良く使っています。
おわりに
簡単ですが、趣味で作っているライブラリを紹介させていただきました。 今後、色々便利メソッドとか実装してみて標準にもあると嬉しいなというものがあれば提案していきたいと思います。