Ruby

gemのコードリーディング手法

sidekiq-cronを題材にする いつも調べてしまうので、自分用メモとして残しておく # Gemfile # frozen_string_literal: true source 'https://rubygems.org' git_source(:github) { |repo_name| "https://github.com/#{repo_name}" } gem 'sidekiq' gem "side…

IRBをアップデートすると undefined method `encoding_system_needs' for Reline:Module エラーになるときの対応

環境 $ irb -v irb 1.2.3 (2020-02-15) $ ruby -v ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin18] 解決方法 reline をインストールする gem install reline 参考文献 IRB 1.2.3 does not boot with Ruby 2.7 on my mac · Issue #87 · ruby/i…

Enumerable#none?でReadableなコードにする

Railsにて要素が存在しないことを blank? や empty? で確かめることがある def purchased_book payments payments.none? "未購入" : "購入済み" end しかし、あるユースケースではRubyの Enumerable#none? を利用した方が意味が明らかになるので、積極的に利…

Design Patterns in RubyでStrategyパターンを学んだ

Design Patterns in Ruby でStrategyパターンを学んだ。自分用のメモとして残しておく。 Design Patterns in Ruby (Adobe Reader) (Addison-Wesley Professional Ruby Series) (English Edition)作者:Russ Olsen出版社/メーカー: Addison-Wesley Professiona…

Rubyであるメソッドの定義場所を知る方法

OSSなど実装を見る機会が乏しいコードに触れる時、あるメソッドがどこに定義されているか継承を辿るとデバッグに時間がかかる時がある。 そんな時は、methodとsource_locationメソッドを利用すると便利である。 GraphQL::Types::String.method( :graphql_def…

Rubyの予約語を取得する方法

Rubyの予約語を取得するワンライナーを知った。いくつか疑問があるので忘れないように残しておく。 RubyToken::TokenDefinitions.select { |definition| definition[1] == RubyToken::TkId }.map { |definition| definition[2] }.compact しかし、v2_7_0_pre…

Rubyでは、クラスの比較ができる

Rubyでは、クラスを比較できることを知ったのでメモとして残しておく。 String < Object 比較演算子は、Moduleクラスに存在している。 ここで、以下を比較すると結果としてnilが返る。 Kernel < BasicObject これは、BasicObjectとKernelが継承関係にないか…

Rubyのmodule_functionは、引数なしで指定できる

Classにmoduleをmix-inしてもmoduleで定義したクラスメソッドを利用できない。 これを解決するために、以下ようにincludeされた時点でクラスに対してmoduleをextendする方法がある。 module M def self.included(klass) klass.extend ClassMethods end modul…

GemfileにRubyのVersionをベタ書きしない方法

GemfileにRubyのVersionをベタ書きしているプロジェクトがある。 rbenvでVersion管理を行っている場合、rbenv local 2.6.5と実行すると.ruby-versionというファイルが作られる。 $ cat .ruby-version 2.6.5 そして、Gemfileで以下の記述するとGemfileにRuby…

Gemのアップデート方法

エンジニアとして働き始めると、学生時代には意識しない問題に取り組むことが多くなります。 ライブラリのアップデートもその中の一つでしょう。RubyのライブラリであるGemをアップデートする方法を学んだので忘れないうちにアウトプットしようと思います。 …

Railsでクラスインスタンス変数とクラス変数を利用する前に、設計を見直そう

下記のようなクラスインスタンス変数を定義した後に、値を確認する方法としてAPI::APIBase.class_eval { puts @remote_host }があります。class_evalは、Moduleクラスのインスタンスメソッドでブロック内でレシーバ定義式の中であるように振舞います。 ENV['…

sendメソッドについて

RSpecを用いたServiceクラスのテストにて、 __send__ メソッドが使われていました。 知らないメソッドだったので、調査してみました。 Ruby 2.5.0リファレンスマニュアルには、send と __send__ について下記のように記載されています。 オブジェクトのメソ…