Rubyリハビリする

rubocopの入れ方

gemがどこにインストールされるか
gem environment gemdir
/Users/yuuki_haga/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0
gem which rubocop
/Users/yuuki_haga/.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/rubocop-1.56.4/lib/rubocop.rb

require: falseについて

bundle list コマンドは、現在のプロジェクトにインストールされているすべての gem とそのバージョンを表示する Bundler のコマンドです。

ヒント出るようになった

この記事で紹介されているプラグイン入れてから、開発しやすくなった。
特にsoloargraphが使いやすい。

RubyでRSpecの環境を構築する

モジュールのRSpecを書くときにこれが参考になった
モジュールをミクシンしたクラスを作れば良いのか

ここまでで参考にした記事
requireとrequire_relativeは拡張子を省略できる
クラスの命名規則のってた
Rubyのincludeはインスタンスメソッドとして使えるようになる

ここまでで参考にした記事
標準入力のスタブがなぜかできなかったんよなああ。実行しているファイルの1行が標準入力としてなぜか入っていた。

プリティアなぜか動かんかったから、一旦保留

グローバルマッチはscanを使えば良さそう

rubyの例外処理はTSのtry ~ catchではなくて、begin ~ rescureでやっている。

require_relative "../../modules/stdin_module"
require "faker"
# stdinのテストがなぜかうまくいかなかったので、stdinのテストは保留
RSpec.describe StdinModule do
let(:stdin_class) { Class.new { include StdinModule } }
let(:stdin_class_instance) { stdin_class.new }
# let(:$stdin) { StringIO.new("apple, orange, pine") }
describe "#get_multiple_words" do
context "when separate is comma" do
it "array length is 3" do
stdin_class_instance.stub(:gets).and_return("apple, orange, pine")
words = stdin_class_instance.get_multiple_words
expect(words.size).to eq 3
end
end
end
end

ここまでで参考にした記事
letは内側のやつが参照される
beforeとかletですごい迷った記憶があるけど、何が原因だったのか忘れた。
配列が空かどうかはempty?を使えば良い
Rspecを実行するなら、rubyコマンドじゃなくて、rspecコマンドを使う。
Rspecのdescribeの隣に書いたモジュールやクラスネームは、described_classで参照できる
module_functionを使うと、module_functionを実行すると以下の2つの処理が行われる。
・インスタンスメソッドのprivate化
・publicクラスメソッドの作成
これ気をつけないとな。

ここまでで参考にした記事
配列から重複していない要素を取り出す
実際にはこんなコードを書いた
# @param [Array<Integer>] numbers
# @return [Integer]
def get_unique_number(numbers)
number_counter = Hash.new(0)
numbers.each { |number| number_counter[number] += 1 }
unique_numbers = number_counter.filter { |_, count| count == 1 }.keys
unique_numbers[0]
end
JSON.parseで文字列を配列にしたりハッシュにしたりできる
Hash.newで空の配列を作れる。引数はキーに対応する値が存在しない時のデフォルト値
引数を省略した場合、{} と同じ
filter
begin ~ rescue
カスタム例外
メソッド内ではbeginとendを省略できる。省略するほうが推奨される
def redundant
begin
ala
bala
rescue StandardError => e
something
end
end
def preferred
ala
bala
rescue StandardError => e
something
end
resucue書くときに、捕虜する例外クラスを指定しないと怒られる。
エラークラスを使うときに、引数を指定するのかは、Rubocopの設定を指定できる

ここまでで参考にした記事
mainメソッド
コンパクト記法では最後(一番右端)以外の名前空間に対しては class か module かを指定しない。コンパクト記法ではその名前空間が定義されていれば参照するが、定義されていなければ例外が発生する(つまり、自動で定義して欲しい場合なら、ネスト記法を使う。
yardでドキュメントを生成できる。しかもweb上で見れちゃう
Array#delete_atは、配列の指定されたインデックスの要素を削除する
loopを使えば、breakでループを終了させない限りループし続ける処理を実装できます。
Array#reverse_eachは、各要素に対して逆順にブロックを評価する
rubyにもbreakとcontinueあった
OFFSET句は、データの取得を行う最初の位置を指定する
RubyでWhile trueで無限ループもできるが、無限ループしたいなら、loopを使えば良い
rubyは基本値渡しだが、配列の時だけ参照渡しになるそう。
メソッド内でそのメソッドを使う人が予想だにしない処理を加えない。
一連のまとまった処理ならそれでメソッドを作る
Array#emptiy?意外と使う。length == 0をしなくて済むから楽。

Rubyのモジュールとは

Rubyでモジュール知りたいなら、この記事地味にわかりやすい

プルリクのテンプレート