🍒

Rubyまとめ

2025/02/01に公開

Rubyまとめ

基礎知識

前提

  • Rubyでは全てがオブジェクト

文の区切り

  • 基本は改行で区切り
  • セミコロンで明示的に区切ることができる
  • 文が続くと明らかな場合は改行できる
  • バックスラッシュで文が続くことを明示的に示せる

コメント

  • #でコメント
  • =begin, =endで複数行コメント(主にドキュメント用)

ローカル変数

  • 変数の宣言だけはなく、代入とセット
  • 変数名は小文字のスネークケース(ex. sample_value)
  • 多重代入ができる
a, b = 2, 4

文字列

  • シングルクォートはそのままの文字列
  • ダブルクォートは特殊文字、#{}の式展開が使える
  • エスケープはバックスラッシュ
  • >, <, <=, >=, ==, !=で比較できる
  • %記法で文字列が作れる
    • %q!xxx!でシングルクォートと同様
    • %Q!xxx!でダブルクォートと同様
  • ヒアドキュメントが使える

数値

  • 数値の区切りにアンダースコアが使える
  • 整数の場合、to_fメソッドで少数に変換できる

真偽値

  • false, nilは偽
  • それ以外は真

if式

if 条件式
    処理
elsif 条件式
    処理
else
    処理
end
  • if文は最後に評価した式を値として返す
  • 式として使用した時に、どの条件も満たさなかった場合はnilを返す
  • 後置ifが使える
  • 条件式の否定版でunlessが使える

メソッド

  • メソッド名はスネークケース
  • 最後に評価された値が戻り値
  • returnはあるが、戻り値としてはあまり使われない
  • メソッドからの離脱でreturnを使うことが多い
  • 引数がなければ()ごと省略できる
  • 引数があるときは()をつけた方が見やすい
  • デフォルト引数が使える
  • ?でメソッド名が終わるものは真偽値を返す
  • !でメソッド名が終わるものは相対的に危険(破壊的)
  • エンドレスメソッドが使える
def hello = 'hi!'
def add(a, b) = a + b
  • object_idメソッドで同じ参照か確認できる
  • require ライブラリ名でライブラリを読み込める
  • 自作ファイルの場合はrequire_relativeを使う
  • putsメソッドは改行をつけて出力。戻り値はnil。
  • printメソッドは改行なし出力。

配列、繰り返し

配列

# 空配列
[]
# リテラル
[a, b, c]
  • 異なるデータ型も格納できる
  • 配列に配列をいれられる
  • 存在しない添字はnilが返る
  • size, lengthで長さが返る
  • <<で配列の最後に値を追加できる
  • pushメソッドでも最後に値をつ以下できる
  • delete_atで要素を削除できる
  • 配列から多重代入できる
  • 配列[位置, 長さ]で指定位置から長さ分取得する
  • values_atメソッドで取得したい要素の添字を複数指定できる
  • 配列に負の数の添字が使える
  • 先頭の値、末尾の値を取得するfirst, lastメソッドがある
  • concatで文字列連結できる(破壊的)
  • +でも文字列連結できる(非破壊的)
  • *を使って多重代入時に残りの要素を受け取れる
  • *を使って配列の展開ができる(複数の引数にできる)
  • == で等しい配列か確認できる
  • デフォルト値を持つ配列を作成できる
    • Array.new(num)で要素が5つの配列(値はnil)
    • 第二引数に値を入れられる
    • ブロックを使ってデフォルト値をつけられる
    • デフォルト値を第二引数で入れる時はイミュータブルかどうかに注意

繰り返し

array = [a, b, c, d]
array.each do |char|
    p char
end
  • deleteメソッドは、配列内の完全一致した要素を削除する
  • delete_ifメソッドは、ブロックの戻り値が真だったとき要素を削除する
  • ブロックを一行で済ませたい時は{}だとスッキリ
  • each_with_indexメソッドで繰り返し時に添え字も取得できる
  • mapなどではwith_indexを併せて使用する
  • breakでくり返しから抜けることができる
  • breakに引数を渡すと戻り値になる(渡さなければnil)
  • throw, catchで複数のくり返しから抜け出せる(例外処理ではない)
  • 次の繰り返しに進む場合はnextを使う

配列のメソッド

map(collect)

ブロックで評価した値を新しい配列に格納して返す

select, find_all, reject

配列の要素をブロックで評価し、真になった値を新しい配列に格納して返す
(rejectは偽になった要素)

find, detect

ブロックの戻り値が真になった最初の要素を返す
見つからない場合はnilを返す

sum, join

要素の合計を求める
文字列の場合は要素を結合する
文字列の結合ではjoinが使いやすい

&, シンボル

以下の条件の時、メソッドに&:メソッド名を渡せる

  • ブロックパラメータが一つ
  • 呼び出すメソッドに引数がない
  • メソッドを一度呼び出すだけ

範囲(Range)

  • 最初の値..最後の値(最後の値含む)
  • 最初の値...最後の値(最後の値を含まない
  • 配列や文字列の添字に使える
  • n以上m以下(未満)などの表現に便利
  • 範囲オブジェクトにto_aメソッドを使うことで配列を作れる
  • 範囲オブジェクトにeach, stepメソッドで繰り返し処理ができる
  • 最初の値、最後の値を省略あるいはnilにすることでエンドレスレンジを定義できる

ハッシュ

基本形

# 空のハッシュ
{}
# サンプル
{
    'one' => 'ichi',
    'two' => 'ni',
    'three' => 'san',
}

要素の追加、変更、取得

currencies = {
    'japan' => 'yen',
    'us' => 'dollar',
    'india' => 'rupee',
}
# 値追加(既にあった場合は更新)
currensies['italy'] = 'euro'
# 値取得(キーがない場合はnil)
currensies['japan']

繰り返し処理

# 基本系
currencies.each do |key, value|
    puts "#{key} : #{value}"
end

# パラメータひとつの場合は配列になる
currencies.each do |array|
    puts "#{array[0]} : #{array[1]}"
end
  • == でハッシュの内容が同じか確認できる
  • 並び順が違くても同じとみなされる
  • キーが一緒でも値がちがければfalse
  • sizeメソッドでキーバリューセットの数がとれる
  • deleteメソッドで要素を削除できる(引数はキー)

Minitest

雛形

require 'minitest/autorun'

class SampleTest < Minitest::Test
    def test_sample
        assert_equal 'RUBY', 'ruby'.upcase
    end
end
  • クラス名にTESTをつける
  • クラス名はキャメルケース
  • ファイル名はスネークケース
  • メソッド名はtest_で始める
  • assert_equalは値が等しいか検証
  • assertは値が真か検証
  • refuteは値が偽か検証

Discussion