💎

Ruby初級 - Rubyの基礎についてのまとめ-

2023/11/22に公開

自分を含め、初学者が最初に押さえておくと良い基礎部分をまとめてみました✍️
※この記事ではクラス・メソッド・モジュールなどに関しては含めていません。
もし誤りなどがありましたらご指摘いただけたらと思います🙏

整数・小数・文字列

  • 整数(Integer):整数または整数オブジェクトと言う
  • 小数(Float):小数または小数オブジェクトと言う
  • 文字列(String):文字列または文字列オブジェクトと言う

四則計算📝

1 + 2   #加算  実行結果:3
2 - 1   #減算  実行結果:1
1 * 2   #乗算  実行結果:2
2 / 1   #除算  実行結果:2
2 ** 8  #累乗  実行結果:256(2の8乗)
7 % 3   #剰余  実行結果:1(7を3で割った余り)

【小数点の計算方法】

puts 5.0 / 2.0 # => 2.5
puts 5 / 2     # => 2(0.5は切り捨てとなる)

【数値と文字列を足す場合】
混合して加算はできないため、それぞれIntegerへ変換・Stringへ変換し統一する必要がある。

puts 3 + "3" # => errorとなる
puts 3.to_s + "3" # => 33
puts 3 + "3".to_i # => 6

【文字列に計算式や変数を含める場合】

puts "計算結果は#{1 + 2}です" # => 計算結果は3です
name = "John"
puts "名前は#{name}です" # => 名前はJohnです

変数・定数・配列・引数・クラス・モジュール名の命名規則⚠️

項目 説明
変数 全て小文字 例)number
定数 頭文字が大文字 例)Number
配列 複数形
2単語以上を繋ぐ場合はスネークケース
例)numbers
  even_numbers
引数 全て小文字
2単語以上を繋ぐ場合はスネークケース
例)even_number
Class 頭文字が大文字
2単語以上を繋ぐ場合はキャメルケース
例)EvenNumbers
Module 頭文字が大文字
2単語以上を繋ぐ場合はキャメルケース
例)EvenNumbers

条件分岐

【Rubyの真偽について】
Rubyではfalseもしくはnilだけがfalse(偽)で、それ以外は0や空文字列””も含め全てtrue(真)と評価される。

  • false(偽): false または nil
  • true(真) : 偽値ではないすべて

💡Ruby 3.2 リファレンスマニュアル 制御構造

ifと実行条件について

Rubyのif実行条件は、falseもしくはnil以外の場合である。
つまりtrueとfalse以外でもエラーにならない。
falseもしくはnilという値は「成り立たない(false)」、それ以外(trueも含む)は「成り立つ(true)」と解釈される。

# 【実行されるif文】
if true
  puts "実行"
end

if !false
  puts "実行"
end

# 0 はfalseでもnilでもないので実行される
if 0
  puts "実行"
end

# 【実行されないif文】
if false
  puts "実行できません"
end

if !true
  puts "実行できません"
end

if !0
  puts "実行できません"
end

後置if

Rubyには後置ifという書き方がある。

#【通常のif文の書き方】
if sunny
  puts "洗濯をする"
end

#【後置ifの書き方】
puts "洗濯をする" if sunny

後置ifの書き方のメリットは省略しすっきりと書けることだが、場合によって使い分けが必要である。
どういう場面での仕様が向いているかに関しては下記の記事が参考になりました!
💡【Ruby】乱用厳禁!?後置ifで書くとかえって読みづらくなるケース

unlessと実行条件について

unlessはfalseの場合(falseとnil)に実行される。
ただしelsifはunlessにはないため、複数の条件を使う場合はifを使用する。

# 【実行されるunless文】
unless false
  puts "実行"
end

unless nil
  puts "実行"
end

# elseは使用可能(elsifは不可)
unless false
  puts "条件はfalseです"
else
  puts "条件はtrueです" # 条件式がtrueの場合に評価する式
end

# 【実行されないunless文】
unless !false
  puts "実行できません"
end

unless true
  puts "実行できません"
end

unless 0
  puts "実行できません"
end

case/whenについて

条件分岐が多くなる場合、ifelsifを使用すると可読性が悪くなる場合がある。
その場合はcase/whenを使用する。

  • whenには単数の値以外に、複数の値/配列/Rangeオブジェクト/正規表現がセットできる。
    ※配列の場合は配列名の前に*をつけることで、配列展開され下記の場合fruitと比較ができるようになる。
    *がない場合、fruitが配列と完全に一致しているかで判定される。

  • caseの後に変数を書かない書き方の場合、一致以外の条件を書くことができる。
    when節の条件を先頭から順に判定して、最初に条件を満たした箇所の処理を行う。

  • また条件分岐内ではputsの省略が可能。

# 基本の書き方
fruit = "Apple"
case fruit
when "Orange"
  "今日のフルーツはオレンジです" # puts "今日のフルーツはオレンジです"のputsは省略可
when "Apple"
  "今日のフルーツはリンゴです"
else
  "今日のフルーツはありません"
end
# => 今日のフルーツはリンゴです

# 複数の値
fruit = "Apple"
case fruit
when "Orange"
  "今日のフルーツはオレンジです"
when "Apple", "Grape" # 複数の値がセットできる
  "今日のフルーツは旬のフルーツです"
else
  "今日のフルーツはありません"
end
# => 今日のフルーツは旬のフルーツです

# 配列
fruit = "Apple"
fruits1 = ["Peach", "Orange"]
fruits2 = ["Apple", "Grape"]

case fruit
when *fruits1 # 配列名の前に*を付けてセットする。
  "今日のフルーツは夏のフルーツです"
when *fruits2
  "今日のフルーツは秋のフルーツです"
else
  "今日のフルーツはありません"
end
# => 今日のフルーツは秋のフルーツです

# Rangeオブジェクト
id = 10
case id
when 1..5
  "組分けはAチームです"
when 6..10
  "組分けはBチームです"
else
  "組分けはCチームです"
end
# => 組分けはBチームです

# 正規表現
id = "あいうえお"
case id
when /^[0-9a-zA-Z]+$/
  "id入力を受付しました"
else
  "idは英数字(大文字・小文字両方可)で入力してください"
end
# => idは英数字(大文字・小文字両方可)で入力してください

# caseの後に変数を書かない使い方
price = 500
case
when price > 500
  puts "購入を見送る"
when price <= 500
  puts "購入する"
end
# => 購入する

💡参考:【Ruby】case/when構文を使った条件分岐の実装方法

論理演算子

論理演算子 意味
!
not
!A Aが真のとき偽、偽のとき真を返す
notは!に比べ優先順位が低い
||
or
A || B AもしくはBが真のとき真、どちらも偽のとき偽を返す
||は&&に比べ優先順位が低い
orは||に比べ優先順位が低い
&&
and
A && B AかつBが真のとき真、それ以外は偽を返す
&&は||に比べ優先順位が高い
andは&&に比べ優先順位が低い

論理演算子の優先順位

高い   ::
       []
       +(単項)  !  ~
       **
       -(単項)
       *  /  %
       +  -
       << >>
       &
       |  ^
       > >=  < <=
       <=> ==  === !=  =~  !~
       &&
       ||
       ..  ...
       ?:(条件演算子)
       =(+=, -= ... )
       not
低い   and or

# 「&&」は「||」より優先順位が高いので、以下のように解釈される
a && b || c   #=> (a && b) || c
a || b && c   #=>  a || (b && c)

💡参考:Ruby 3.2 リファレンスマニュアル 演算子式

条件演算子(三項演算子)

# 文法1 ?2 :3

# 式1の結果によって式2または式3を返す。上記の書き方は下記の式と同じである。
if1 then2 else3 end

# 例
foo = "foo"
bar = "bar"
obj = 1

obj == 1 ? foo : bar
# => foo

配列

要素へのアクセス

numbers = [1, 2, 3, 4]

# 配列の最初の要素を取得
numbers[0]    # => 1
numbers.first # => 1

# 配列の最後の要素を取得
numbers[-1]  # => 4
numbers.last # => 4

# その他、添字を指定した場合
numbers[2]  # => 3 最初から3番目の要素を取得
numbers[4]  # => nil 範囲外の場合はnilを返す
numbers[-2] # => 3 最後から2番目の要素を取得
numbers[-5] # => nil 範囲外の場合はnilを返す

# 長さ付き添字を指定した場合
numbers[2, 2]   # => [3, 4] number[n, m]:n番目からm個の要素を指定
numbers[-2, 2]  # => [3, 4] 開始位置(n番目)に負の添字の指定は可能
numbers[-2, -1] # => nil m個に負の添字の指定は不可
numbers[2, -1]  # => nil m個に負の添字の指定は不可

# 範囲添字を指定した場合
numbers[0..1]   # => [1, 2] 最初から1番目までの要素を取得
numbers[0...1]  # => [1]    最初から1番目未満までの要素を取得
numbers[-2..-1] # => [3, 4] -2番目から-1番目までの要素を取得
numbers[-2..3]  # => [3, 4] -2番目から3番目までの要素を取得
numbers[-2..1]  # => []     -2番目から1番目までの要素 該当無し
numbers[2..1]   # => []     2番目から1番目までの要素 該当無し
numbers[-1..-2] # => []     -1番目から-2番目までの要素 該当無し
numbers[4..5]   # => []     4番目から5番目までの要素 該当無し
numbers[3..5]   # => [4]    3番目から5番目までの要素を取得 該当する要素のみ返す

配列のループ処理 each

# 基本の書き方
numbers = [1, 2, 3]
numbers.each do |number|
  puts number
end

# 下記のように{}を使用する書き方も可能。ただし複数行の場合は上記のdo/endの方が一般的。
numbers.each{|number|
  puts number
}
# => 1
# => 2
# => 3

# Rangeオブジェクトを指定する
(2..3).each do |number|
  puts number
end
# => 2
# => 3

# nextで次へ進める
numbers.each do |number|
  next if number == 2
  puts number
end
# => 1
# => 3

# breakで終了させる
numbers.each do |number|
  break if number == 2
  puts number
end
# => 1

Hashについて

Hashの書き方

Hashの書き方は2通りあり2️⃣のほうが主流だが、keyに文字列などのシンボル以外のオブジェクトを使う時は1️⃣のようにハッシュロケット「=>」を使用した書き方を使う。
通常keyにはシンボルを使うことが多いが、値には文字列や整数以外に、配列・別のハッシュを置くことができる。

#1
{:book => "The Remains of the Day", :author => "Kazuo Ishiguro"}
#2
{book: "The Remains of the Day", author: "Kazuo Ishiguro"}

#keyに文字列を使用した場合
{"本" => "The Remains of the Day", "著者" => "Kazuo Ishiguro"}

#値に配列を入れる
{band: "The Beatles", members: ["John", "Paul", "Ringo", "George"]}

Hashへの要素の追加・削除

#【要素の追加】
book_data = {book: "The Remains of the Day", author: "Kazuo Ishiguro"}
book_data[:year] = 1989 #ここでkeyとvalueを追加
p book_data
# => {:book=>"The Remains of the Day", :author=>"Kazuo Ishiguro", :year=>1989}

#【要素の削除】
book_data = {book: "The Remains of the Day", author: "Kazuo Ishiguro", year: 1989}
book_data.delete(:year)
p book_data
# => {:book=>"The Remains of the Day", :author=>"Kazuo Ishiguro"}

#【値の上書き】
book_data = {book: "The Remains of the Day", author: "Kazuo Ishiguro", year: 1989}
book_data[:year] = 1990  #すでに存在するkeyにvalueを代入した場合、値が上書きされる
p book_data
# => {:book=>"The Remains of the Day", :author=>"Kazuo Ishiguro", :year=>1990}

#【存在しないkeyを指定した場合】
book_data = {book: "The Remains of the Day", author: "Kazuo Ishiguro", year: 1989}
p book_data[:publisher]
# => nilが返る

#【keyが存在しない場合のdefault値を設定】
book_data = {book: "The Remains of the Day", author: "Kazuo Ishiguro", year: 1989}
book_data.default = 0
p book_data[:publisher]
# => 0が返る

#【2つのHashをまとめる】
book = {book: "The Remains of the Day", author: "Kazuo Ishiguro"}
year = {year: 1989}
book_data = book.merge(year)
p book_data
# => {:book=>"The Remains of the Day", :author=>"Kazuo Ishiguro", :year=>1989}

Hashのループ処理

#【keyとvalueを取り出す場合】 ブロックの変数は2つ(key, value)
fruits = {"りんご" => 400, "オレンジ" => 300}

fruits.each{|key, value|
  puts "#{key}の価格は#{value}円です"
}
# => りんごの価格は400円です
# => オレンジの価格は300円です

#【keyのみ取り出す場合】 each_keyを使用し、ブロックの変数は1つにする(key)
fruits = {"りんご" => 400, "オレンジ" => 300}
fruits.each_key{|key|
  puts key
}
# => りんご
# => オレンジ

よく使う基本的メソッド

メソッド 説明
puts 後ろに書いた引数を画面に表示する。
出力後に改行が行われる。
puts "Ruby" # => Ruby
p 後ろに書いた引数を表示する。
putsに似た機能で、デバッグによく使われる。(変数やオブジェクト、配列)
出力後に改行が行われる。
name = "John"
numbers = [1, 2, 3]
p name # => John
p numbers # => [1, 2, 3]
print 後ろに書いた引数を画面に表示する。
出力後に改行は行われない。
print "Hello"
print "World"
# => HelloWorld
to_i 「整数」へ変換する。 puts 3 + "3".to_i # => 6
to_s 「文字列」へ変換する。 puts 3.to_s + "3" # => 33
to_f 「小数」へ変換する。 puts 7.to_f / 3 # => 2.3333333333333335
to_sym 「シンボル」へ変換する。 p "book".to_sym => :book
times 指定回数だけ繰り返し実行する。 3.times {puts "Ruby"}
# => Ruby
# => Ruby
# => Ruby

配列操作の基本メソッド

メソッド 説明
unshift
※破壊的
配列の先頭へ追加 members = ["John", "Emma", "Ken"]
members.unshift("Anna")
p members # => ["Anna", "John", "Emma", "Ken"]
push
※破壊的
配列の末尾へ追加 members = ["John", "Emma", "Ken"]
members.push("Anna")
p members # => ["John", "Emma", "Ken", "Anna"]
shift
※破壊的
配列の先頭から削除
削除した要素を返す
members = ["John", "Emma", "Ken"]
p members.shift # => John
p members # => ["Emma", "Ken"]
pop
※破壊的
配列の末尾から削除
削除した要素を返す
members = ["John", "Emma", "Ken"]
p members.pop # => Ken
p members # => ["John", "Emma"]
<<
※破壊的
※演算子だがpushと同様、配列の末尾へ追加 members = ["John", "Emma", "Ken"]
members << "Anna"
p members # => ["John", "Emma", "Ken", "Anna"]
size 配列の要素数を返す puts [1, 2, 3].size # => 3
length 配列の要素数を返す puts [1, 2, 3].length # => 3
count 引数を指定すると、配列の中で引数と等しい要素の数を返す
指定しなければ配列の要素数を返す
puts [1, 2, 4, 2.0].count(2) # => 2
puts [1, 2, 3].count # => 3
sum 配列内全要素の合計値を返す puts [1, 2, 3].sum #⇒ 6
uniq
※非破壊的
配列から重複した要素を除く
元の配列は変更されず、新たな配列を生成して返す
p [1, 2, 3, 1, 2].uniq # => [1, 2, 3]
sample 配列から要素をランダムに取得する puts [1, 2, 3].sample # => 1または2または3のいずれかを取得
shuffle
※非破壊的
配列の要素をランダムに並び替える
元の配列は変更されず、新たな配列を生成して返す
p [1, 2, 3].shuffle # => 例)[1, 3, 2]
sort
※非破壊的
配列の要素を昇順に並び替える
文字列オブジェクトの場合は辞書順で、大文字→小文字の順
元の配列は変更されず、新たな配列を生成して返す
p [3, 1, 2].sort # => [1, 2, 3]
p ["John", "Emma", "Ken"].sort # => ["Emma", "John", "Ken"] ※アルファベット順
reverse
※非破壊的
配列の要素を逆順に並び替える
順番を反転した新たな配列を生成して返す
p [3, 1, 2].sort.reverse # => [3, 2, 1]
※sortで昇順にし、メソッドチェーンでreverseを繋げて降順にする(降順にソートされた新たな配列を生成して返す)
p "abc".reverse # => "cba"
join 配列内の文字列を結合する puts ["パン", "ケーキ"].join # => "パンケーキ"
puts ["パン", "ケーキ"].join("と") # => "パンとケーキ"
split デフォルトはスペース区切りの文字列を分割し配列にする
特定の文字列を指定した場合は、その文字列で区切り配列にする
p "パン ケーキ".split # => ["パン", "ケーキ"]
p "パンとケーキ".split("と") # => ["パン", "ケーキ"]
map 配列の各要素を変換した配列を生成する numbers = [1, 2, 3].map {|number|
number * 2
}
p numbers # => [2, 4, 6]
letters = ["abc", "def", "ghi"].map(&:reverse)
p letters #⇒ ["cba", "fed", "ihg"] ※reverseする場合の省略記法
clear
※破壊的
配列の要素全てを削除して空にする numbers = [1, 2, 3].clear
p numbers # => []
  • 破壊的メソッド(destructive method):レシーバにあたるオブジェクトの値そのものを変更する。
  • 非破壊的メソッド:元のオブジェクトは変更せず、別の新たなオブジェクトを生成し値を変更する。

その他のメソッドに関してはプログラミング言語 Ruby リファレンスマニュアルを参照すると便利です!

参考URL

Discussion