💎

Rubyのいろんなライブラリについて

2022/08/31に公開約8,500字

これはなに

Rubyのライブラリについて概要をザッとまとめました。

ライブラリの種類

組み込みライブラリ

標準添付ライブラリ

Gem

  • インストールが必要
  • rubygems.orgにて利用可能な形で公開している

.
.
.
.
↓↓それぞれ詳しく見ていくよ👀

組み込みライブラリ

  • 組み合わせると便利になるインスタンスメソッドがたくさんある
    • Array, Hash, String, Enumerableのるりまを覚えておくといい LINK

Arrayクラス

  • class Array
  • 配列を持つクラス
    • 配列は任意の Ruby オブジェクトを要素として持つことができる
  • 一般的な配列の形は[1,2,3]
  • 配列に値を追加する
    • push:順番に配列の末尾へ追加する
      array = [1, 2, 3]
      array.push 4
      array.push [5, 6]
      p array          # => [1, 2, 3, 4, [5, 6]]
      
  • <<:自身の末尾へ破壊的に追加する
    ary = [1]
    ary << 2 
    ary << 3 << 4 << 5
    p ary   #=> [1, 2, 3, 4, 5]
    
  • pop:末尾から要素を取り除いてそれを取得する
  • shift:先頭から要素を取り除いてそれを取得する
  • unshift:指定した引数の最後から順番に要素の最初へ追加する
    arr = [1,2,3]
    arr.unshift 0
    p arr             #=> [0, 1, 2, 3]
    arr.unshift [0]
    p arr             #=> [[0], 0, 1, 2, 3]
    arr.unshift 1, 2
    p arr             #=> [1, 2, [0], 0, 1, 2, 3]
    
  • to_a:配列に変換してくれる
    def join_arrays(a1,a2)
    a1.to_a + a2.to_a
    end
    
    array1 = [10,20,30]
    array2 = [40,50,60]
    
    p join_arrays(array1,array2) # => [10, 20, 30, 40, 50, 60]
    

Hashクラス

  • class Hash
  • keyとvalueのオブジェクトを持つクラス
    • 更新不可ではない文字列をキーに与えた場合は文字列をコピーし、コピーを更新不可として設定する事Object#freezeが必要である
    • ハッシュに含まれる要素の順序が保持されるようになった。追加順で列挙される。
  • 簡単な操作
    • 作成
      animals = {"ねこ" => "3匹", "犬" => "4匹", "ハムスター" => "1匹"}
      puts animals["ねこ"]
      => 3
    • 追加
      animals = {"ねこ" => "3匹", "犬" => "4匹", "ハムスター" => "1匹"}
      animals["うさぎ"] = "5匹"
      puts animals
      => {"ねこ" => "3匹", "犬" => "4匹", "ハムスター" => "1匹", "うさぎ" => "5匹"}
      
    • 更新
      animals = {"ねこ" => "3匹", "犬" => "4匹", "ハムスター" => "1匹"}
      animals["ハムスター"] = "5匹"
      puts animals
      => {"ねこ" => "3匹", "犬" => "4匹", "ハムスター" => "5匹"}
      
    • 削除
      animals = {"ねこ" => "3匹", "犬" => "4匹", "ハムスター" => "1匹"}
      animals.delete["ねこ"]
      puts animals
      => {"犬" => "4匹", "ハムスター" => "5匹"}
      
  • eachでキーと値を順番に取り出す
    # 一発で出力
    {:a=>1, :b=>2}.each {|a| p a}
    #=> [:a, 1]
    #   [:b, 2]
    # ブロックで一つずつ出力
    animals = {"ねこ" => "3匹", "犬" => "4匹", "ハムスター" => "1匹"}
    animals.each{
    |name, count|
    p "#{name}#{count}です。"
    }
    
  • selectでkeyまたはvalueで真となるペアだけを含むハッシュを生成して返す
    h = { "a" => 100, "b" => 200, "c" => 300 }
    h.select {|k,v| k > "a"}  #=> {"b" => 200, "c" => 300}
    h.select {|k,v| v < 200}  #=> {"a" => 100}
    
  • Hashにもto_aが使える
    human = {name: "pikawaka", age: e25}
    human.to_a
    => [[:name, "pikawaka"], [:age, 25]]
    

Stringクラス

  • class String
  • 文字列のクラス。ヌル文字を含む任意のバイト列を扱える。メモリ容量以外の制限はない。
  • RubyのStringは文字列を破壊的に変更ができる
    • 大文字に変える場合の例
    # upcaseは破壊的。bにも波及する。
    a = "string"
    b = a
    a.upcase!
    p a   # => "STRING"
    p b   # => "STRING"
    # upcaseは非破壊的。bには波及しない。
    a = "string"
    b = a
    a = a.upcase
    p a   # => "STRING"
    p b   # => "string"
    
  • エンコーディングはバイト単位ではなく文字単位
    p "いろは".size      #=> 3
    p "漢字"[0]          #=> "漢"
    p "ループ".reverse   #=> "プール"(逆転する)
    
    s = "ruビー"
    s[0..1] = "ル" # 0~1文字を変える
    p s                  #=> "ルビー"
    
    e = "言語".encode("EUC-JP")
    u = "言語".encode("UTF-8")
    p e.encoding                   #=> Encoding::EUC_JP
    p u.encoding                   #=> Encoding::UTF_8
    

他にもいろいろよく使われるライブラリ

  • freeze

    • オブジェクトの内容を凍結し、破壊的な操作を防ぐ
    PERMIT_ID = ['0001', '0002', '1234']
    PERMIT_ID.freeze
    PERMIT_ID.reject! { |id| id == '1234' }
    # => RuntimeError: can't modify frozen Array
    
    p PERMIT_ID
    # => ["0001", "0002", "1234"]
    
    • 凍結の解除はできないがdupする事で同様のことは可能。
    • frozenは凍結の有無を確認できる
    a = [1].freeze
    p a.frozen?     #=> true
    
    a[0] = "foo"
    p a             # can't modify frozen Array (FrozenError)
    
    b = a.dup
    p b             #=> [1]
    p b.frozen?     #=> false
    
  • nil?

    • Objectクラスに属する
    • 一番上の階層に属するクラスのため、大体どんなものに対してもnil判定のために使用できる
  • empty?

    • いろんなクラスから生えていて、クラスによって空である場所を見るところが若干変わる
      • Arrayなら空配列、Stringなら空文字列とか。空の定義がクラスによって異なる。
      • るりまサーチに出てくるものが該当する
  • blank? present?

    • これはRailsの機能になる
    • そのためフレームワークがRailsでない場合などは使えない
  • flashの使い分け

    • Railsの機能、クラスメソッド
    • 次のリクエストまで有効なデータ
      • 表示する対象ではflash[:alert]を使う
      • controllerでredirect_toを使う
        • リクエストを再取得してくれる
        • エラー発生時、302コードをブラウザ返して、リクエストが終わる - 別のリクエストをブラウザが投げる - root - controller - view - ブラウザがhtmlを受け取って表示される
    • リクエスト中のみ有効な書き方
      • 表示する対象ではflash.now[:alert]を使う
      • controllerでrenderで次のviewを指示してくれる
      • ブラウザがhtmlを受け取って表示される。再リクエストはされない。
    • 正常系はrenderで異常系はredirect_to、みたいな書き方もできる

標準添付ライブラリ

CSVクラス

Setクラス

  • setライブラリ
  • 重複のないオブジェクトの集まり
  • Array の持つ演算機能と Hash の高速な検索機能を合わせ持つ
    set1 = Set.new ["foo", "bar", "baz", "foo"]
    p set1                  # => #<Set: {"foo", "bar", "baz"}>
    

TimeクラスとDate/DateTimeクラス

  • Timeクラス
    # 時刻を表す文字列をTimeオブジェクトに変換
    time = Time.parse('2021-05-14 12:34') #=> 2021-05-14 12:34:00 +9000
    
    # 各種フォーマットで表現された文字列を返す
    time.iso8601 #=> "2021-05-14T12:34:00+09:00"
    
  • Dateクラス
    # 年月日からDateオブジェクトを得る
    date = Date.new(2021, 5, 14)
    
    # 日付を指定した書式の文字列で表現
    date.strftime('%Y年%m月%d日') #=> "2021年05月14日"
    
    # 妥当な日付か真偽値で確認
    Date.valid_date?(2000, 1, 1) #=> false
    
    # うるう年か真偽値で確認
    Date.leap?(2004) 
    

Gem

  • 例としてawesome_printを使う
    • pメソッドをより見やすい形で表示するapメソッドを提供する

gem install

  • コマンドプロンプト上で一つずつインストールする方法
    # 標準
    gem install Gem名
    # 例
    gem install awesome_print
    # 省略できる
    gem i awesome_print
    
  • コマンド実行後、表示されるGem名の後ろにハイフンで続く数字はバージョン番号
  • 実行した時の最新バージョンがインストールされる
  • Gemのインストールは一回のみでOK

Bundlerを使ってインストールする

  • 複数のGemをインストールしたい時に使う
  • Bundlerはよく使用されるためRuby 2.6.0よりRubyと一緒にインストールされるようになった
  • Bundlerの確認方法
    # 確認方法その1
    bundle -v
    # 確認方法その2
    gem list
    # 上記で出力されない場合はインストールする
    gem install bundler
    
  • bundlerもgemの一つである

使い方

  1. Gemfileを作成
    • Gemをインストールするための発注書みたいなもの
    # Gemfileの雛形を作成
    bundle init
    
    • Gemfileの最後の行に追記する
    # 下記は削除してOK
    # gem "rails"
    
    # 追記する
    gem "awesome_print"
    
  2. コマンドの実行
    bundle install
    
    • Gemfile.lockが作成され、使われているGem名やバージョンが自動で記録される
      • Gemfileが発注書ならば、Gemfile.lockは納品書みたいなもの

バージョンアップの方法

  • 新しいバージョンがリリースされバージョンアップしたい時に使う
  • 古いバージョンのGemはアンインストールされないため、同じGemの複数のバージョンがインストールされた状態になる
    • 通常は新しいバージョンが利用される
# まとめてバージョンアップ
bundle update
# 特定のGemと、そのGemが依存しているGemをまとめてバージョンアップ
bundle update awesome_print

指定したバージョンでGemを使用する

  • Gemfile.lockに書かれたバージョンのGemを使って実行できる
# Gemfile.lockに書かれたバージョンのGemを使って、example.rbを実行する
bundle exec ruby example.rb

よく使われるGemの例

参考

Discussion

ログインするとコメントできます