📕

Ruby について理解する

2024/05/09に公開

目的

Rubyについて学習した内容を記載していきます。

内容

目次参照

オブジェクトとは?

オブジェクトの例 種類
9   60   900   10000 整数オブジェクト(Integer)
1.0   5.5   1.09   0.4 少数オブジェクト(Float)
"ワン" "ok" "6" 文字列オブジェクト(String)
オブジェクトとは

・Ruby では「もの」です。プログラムの中でデータを持ったり、操作をする対象。

オブジェクトの種類のことをクラスという。

IntegerFloatString がそれぞれクラスの名前です。

変数とは?

order = "コーヒー"
puts order

> コーヒー
order が変数

変数 = オブジェクト (変数 order に"コーヒー"を代入すると言う)
order は"カフェオレ"や"カプチーノ"など変わることもあるので、変数で置き換えることで変更は 1 箇所になる。

変数の名前ルール

英字数字_ を使う。先頭は英字小文字か _ で始める。
・2 単語以上つなげるときは、_ を間に入れる。これをスネークケースと言う。

文字列に計算結果を埋め込む

#{計算式}      (式展開の記法)
式展開の例
puts "1 + 1の答えは#{1 + 2}です"

> 1 + 1の答えは3です

irb の使い方

$ irb       (irbの起動)
$ exit    (終了)
puts メソッドなど使わなくても結果を表示する。
MacBook-Air ruby % irb
irb(main):001> 1+2
=> 3
irb(main):002>
ir の中でメソッドを呼び出したい場合

・メソッドのdefからendまでをコピー & ペーストする。
・その後、メソッドを入力すると値が表示される。(nunber(10)メソッドを入力)

irb(main):002* def nunber(10)
irb(main):003*   response = []
irb(main):004*   (1..10).each do |n|
irb(main):005*     if n % 10 == 0
irb(main):006*       response << "いちご"
irb(main):007*     elsif n % 3 == 0
irb(main):008*       response << "みかん"
irb(main):009*     elsif n % 5 == 0
irb(main):010*       response << "りんご"
irb(main):011*     else
irb(main):012*       response << n
irb(main):013*     end
irb(main):014*   end
irb(main):015*   response
irb(main):016> end
=> :nunber
irb(main):017> nunber(10)
=> [1, 2, "みかん", 4, "りんご", "みかん", 7, 8, "みかん", "いちご"]
プログラムの途中で一時停止して irb を使う。
a = 2
puts a
a = 2
binding.irb
puts a

p メソッドとは

p メソッド

pメソッドは後ろに書いた変数やオブジェクトを表示する。
・原則 puts メソッドはプログラム機能として、p メソッドはデバッグの機能として使う。

比較メソッド

・比較し正しけれtrue、正しくなければfalseで返します。

大きさを比較するメソッド

<>が比較メソッドです。大きさを比較します。

puts 1 < 2    (正しいので true)
puts 1 > 2    (正しくないので false)
条件を満たす場合の比較メソッド

<=>=が条件を満たす場合の比較メソッドです。

puts 1 <= 2    (正しいので true)
puts 1 => 2    (正しいので true)

wallet = 500     (財布の残金を表す変数walletに500を代入)
puts wallet >= 300  (walletが300以上かの条件)

> true
wallet = 100     (財布の残金を表す変数walletに100を代入)
puts wallet >= 300  (walletが300以上かの条件)

> false
等しいことを判断するメソッド

== が等しいことを判断する比較メソッドです

puts 1 == 1
puts 1 == 2
puts 2 == 1 + 1

> true
> false
> true

逆に等しくない場合にtrueを返したいときは !=

puts 1 != 2
puts 3 != 3

>true
>false
偶数か奇数かを判断するメソッド

even?メソッドは偶数かどうかを判断する。
odd?メソッドは奇数かどうかを判断する。

puts 2.even?
puts 3.even?
puts 2.odd?
puts 3.odd?

>true
>false
>false
>true

if -条件を満たすときの処理

if の使い方
if 条件
  条件が成立したときの処理
end

「もし財布に 100 円以上入っていればコーヒーを買う」という場合の条件処理

wallet = 100
if wallet >= 100
  puts "コーヒーを買う"
end

> コーヒーを買う
後置 if

・行数が短縮され、endが省ける。短く読みやすく書くことができる。

wallet >= 100
puts "コーヒーを買う" if wallet >= 100

> コーヒーを買う
等しくない場合に true を返す -unless

!=を使った場合

a = 100
if a != 200
  puts "等しくありません"
end

> 等しくありません

unlessを使った場合(if とは反対の働きをする、条件を満たさないときに処理を実行)

a = 100
unless a == 200
  puts "等しくありません"
end

> 等しくありません

else -条件を満たさないときにも処理をする

else の使い方

elseの文法

if 条件
  条件を満たした場合の処理
else
  条件を満たさなかった場合の処理
end

「もし財布に 100 円以上入っていればコーヒーを買う」という場合の条件処理に、elseで「コーヒーを買わない」と言う分岐処理を加える。

wallet = 50
if wallet >= 100
  puts "コーヒーを買う"
else
  puts "コーヒーを買わない"
end

> コーヒーを買わない

elsif -3つ以上の分岐

elsif の使い方

「もし財布に 100 円以上入っていればコーヒーを買う」⇨
「50 円以上入っていればガムを買う」⇨
「満たさない場合は何も買わない」

wallet = 50
if wallet >= 100
  puts "コーヒーを買う"
elsif wallet >= 50
  puts "ガムを買う"
else
  puts "何も買わない"
end

> ガムを買う

複数条件を組み合わせる処理

|| -どちらかの条件を満たすとき「a または b」

||(または)の使い方

「〇〇である、または、△△ であるとき」

if 条件1 || 条件2
  条件を満たしたときの処理
end

「もし、財布残金 100 円以上 または、paypay 残高 100 円以上の場合、コーヒーを買う」という||を使った複数条件の処理

wallet = 50
paypay = 100
if wallet >= 100 || paypay >= 100
  puts "コーヒーを買う"
end

> コーヒーを買う

&& -両方の条件を満たすとき「a かつ b」

&& の使い方

「〇〇である、かつ、△△ であるとき」

if 条件1 && 条件2
  条件を満たしたときの処理
end

「もし、財布残金 100 円以上 かつ 晴れている場合、コーヒーを買う」という&&を使った複数条件の処理

wallet = 100
weather = "fine"   (天気は晴れ)
if wallet >= 100 && weather == "fine"
  puts "コーヒーを買う"
end

> コーヒーを買う

&& と || 早見表

・表は横方向に読みます。
条件aがtrue条件bがtrueのとき、a && bはtruea || bもtrueとなります。

条件 a 条件 b a && b a ll b
true true true true
true false false true
false true false true
false false false false

case -複数条件の中から 1 つを選んで分岐する

case の使い方

caseの文法

case 変数
when 候補1
  変数の値が候補1と等しいときの処理    (複数行記載可能)
when 候補2
  変数の値が候補2と等しいときの処置    (複数行記載可能)
(以下、when候補をさらに追加できる)
end

1つ選ぶ 変数が
"コーヒー"のとき
  100円ですと表示
"ガム"のとき
  50円ですと表示
end
order = "ガム"
case order
when "コーヒー"
  puts "100円です"
when "ガム"
  puts "50円です"
end

> 50円です
複数条件の中に合致するものがない場合 case - else

elseを追加し、条件が合致しない場合の分岐を作る。

order = "ケーキ"
case order
when "コーヒー"
  puts "100円です"
when "ガム"
  puts "50円です"
else
  puts "ありません"
end

> ありません

繰り返す

times メソッド -決まった回数だけ繰り返す

times メソッドの使い方

timesメソッドの文法(n 回繰り返す処理)

n.times do
  繰り返し実行する処理
end

do-endの代わりに{ }を使うことも可能

n.times {
  繰り返し実行する処理
}

2回繰り返す ここから
  "コーヒー"を表示
end
2.times do
  puts "コーヒー"
end

> コーヒー
> コーヒー

1 回目コーヒーを表示、end まできたら次の繰り返しがあるので do へ戻る。
2 回目の表示、eud まできたら繰り返し回数が終わりなので終了。

times メソッドを 1 行で書く

timesメソッドの文法(n 回繰り返す処理)

n.times do 繰り返し実行する処理 end
n.times { 繰り返し実行する処理 }

n.times do puts "コーヒー" end
n.times { puts "ガム }

> コーヒー
> ガム

while -条件を満たしている間ずっと繰り返し処理する

while の使い方 while - end

whileの文法

while 条件
  条件を満たしている間、繰り返し実行する処理
end

cookie = 0
while cookie < 3    (繰り返す条件、cookieは3より少ない)
  cookie = cookie + 1   (変数cookieの値に1を加えて再度代入する)
  puts "ポケットを叩くとクッキーが#{cookie}つ"
end

> ポケットを叩くとクッキーが1つ
> ポケットを叩くとクッキーが2つ
> ポケットを叩くとクッキーが3つ

[ ] -配列

配列とは

・配列は[ ]でオブジェクトをまとめて扱います。配列のクラスはArrayです。
配列の文法

[オブジェクト1, オブジェクト2, オブジェクト3, ・・・]

["コーヒー", "100", "1.09"]   (文字列、整数、少数オブジェクトが入った配列)
["ケーキ"]    (要素が一つの配列)
[ ]   (空の配列)

["コーヒー", "ガム", "ケーキ"]
p ["コーヒー", "ガム", "ケーキ"]

> ["コーヒー", "ガム", "ケーキ"]
配列を変数に代入する

・配列を代入する変数名は複数形にする。(例: drinks)

drinks = ["コーヒー", "カフェラテ", "カプチーノ"]
p drinks

> ["コーヒー", "カフェラテ", "カプチーノ"]
配列の要素の取得

[0] [1] [2]で要素の取得

drinks = ["コーヒー", "カフェラテ", "カプチーノ"]
puts drinks[0]    > "コーヒー"
puts drinks[1]    > "カフェラテ"
puts drinks[2]    > "カプチーノ"

first メソッドlast メソッドで要素の取得

drinks = ["コーヒー", "カフェラテ", "カプチーノ"]
puts drinks.first   > "コーヒー"
puts drinks.last    > "カプチーノ"

nil -何もないことを表すオブジェクト

nil とは

nilは、「何もない」ことを表すオブジェクトです。

drinks = ["コーヒー", "カフェラテ"]
puts drinks[2]    > nil

コーヒーは[0]、カフェラテは[1]なのでnilが返ります。

unshift メソッド -要素の追加

unshift メソッドとは

unshiftメソッドは、配列の先頭に要素を追加

drinks = ["コーヒー"]
drinks.unshift("カフェラテ")    (配列の先頭に追加)
p drinks > ["カフェラテ", "コーヒー"]

pushは、配列の末尾に要素を追加

drinks.push("カプチーノ")   (配列の末尾に追加)
p drinks > ["カフェラテ", "コーヒー", "カプチーノ"]

<<は、pushと同様に配列の末尾に要素を追加

drinks << "ケーキ"    (配列の末尾に追加)
p drinks > ["カフェラテ", "コーヒー", "カプチーノ", "ケーキ"]

要素の削除をするメソッド

pop メソッド と shift メソッド

popメソッドは配列の末尾から要素を 1 つ削除

drinks = ["カフェラテ", "コーヒー", "カプチーノ", "ケーキ"]
drinks.pop
p drinks > ["カフェラテ", "コーヒー", "カプチーノ"]

shiftメソッドは配列の先頭から要素を 1 つ削除する

drinks = ["カフェラテ", "コーヒー", "カプチーノ", "ケーキ"]
drinks.shift
p drinks > ["コーヒー", "カプチーノ", "ケーキ"]

配列を足し算、引き算する

配列の足し算
a1 = [1, 2, 3]
a2 = [4, 5, 6]
p a1 + a2

> [1, 2, 3, 4, 5, 6]
配列の引き算
a1 = [1, 2, 3]
a2 = [1, 3, 4]
p a1 - a2

> [2]

each メソッド -配列を繰り返し処理

each メソッド

eachメソッドは配列の全要素を繰り返し処理するメソッドです。
eachメソッドの前に書かれた配列の各要素が、変数|drink|に繰り返し代入されます。

drinks = ["コーヒー", "カプチーノ"]
drinks.each do |drink|
  puts drink
end

> コーヒー
> カプチーノ
繰り返し処理を途中で終わらせる -break
[1, 2, 3].each do |x|   (配列の各要素を順番に変数xに代入)
  break if x == 3   (xの値が3のときに繰り返しを終わらせる)
  puts x    (変数Xを表示)
end

> 1
> 2
繰り返しの次回へ進む -next
[1, 2, 3].each do |x|   (配列の各要素を順番に変数xに代入)
  next if x == 2   (xの値が2のときにその処理を終了し、次回の繰り返し処理を開始します)
  puts x    (変数Xを表示)
end

> 1
> 3
範囲を指定し繰り返す -Range オブジェクト

文法

配列.each do |変数|
  繰り返す実行する処理
end


「2 から 5 までの数を 1 ずつ増やして繰り返したい」場合の処理。
2..5は範囲を表すRangeオブジェクト

(2..5).each do |x|
  puts x
end

> 2
> 3
> 4
> 5

配列のさまざまなメソッド

class Array(リファレンスマニュアル)
るりまサーチ

配列の要素数を返す -size メソッド

sizeメソッドは配列の要素数を返す。
・数字だけでなくいろいろなオブジェクトを返すことができます。

puts [0, 1, 9].size

> 3
配列の全要素を足す -sum メソッド

sumメソッドは配列の全要素を足す。

puts [6, 9, 10].sum

> 25
平均値の計算 -size、sum メソッド

sum ÷ size = 平均値(合計 ÷ 要素数 = 平均値)

a = [1, 5, 9]
puts a.sum / a.size

> 5
uniq メソッドと uniq!メソッドの違い

uniqメソッドは、重複した要素を取り除く

array1 = [1, 1, 2]
array2 = array1.uniq

p array1 > [1, 1, 2]    (array1自身は変わらない)
p array2 > [1, 2]

uniq!メソッドは、自分自身の配列オブジェクトも重複した要素を取り除き破壊的変更をする

array1 = [1, 1, 2]
array2 = array1.uniq!

p array1 > [1, 2]    (array1自身も重複が取り除かれる)
p array2 > [1, 2]

ブロックを渡せるメソッド

ブロックを渡せるメソッドの例

uniqメソッドにブロックを渡さない場合

p [1, 2, 3, "2", "3"].uniq

> [1, 2, 3, "2", "3"]

uniqメソッドにブロックを渡す場合    { |n| n.to_s } ⇦ これがブロック
{ |n| n.to_s }このブロックは、nは変数、to_sは、文字列へ変換するメソッド
                           (1 は "1"と変換します)

p [1, 2, 3, "2", "3"].uniq { |n| n.to_s }

> [1, 2, 3]

・ブロック{ |n| n.to_s }で配列の各要塞を文字列に変換し[1, 2, 3, "2", "3"]は、["1", "2", "3", "2", "3"]となる。

・元の配列、[1, 2, 3, "2", "3"]の要素自体が変わるわけではない。そのため、結果は文字列ではなく、元の配列の要素の型を保ったまま、重複排除された[1, 2, 3]を返すことになる。

配列の要素を並び替える

配列の要素を順に並び替える -sort メソッド

sortメソッドは配列の要素を並び替える。

要素が数値のときは、小さい順に並び替える。

p [6, 10, 9].sort

> [6, 9, 10]

要素が文字列のときはabc順に並び替える。先頭が同じであれば2文字目で比較、大文字が混じる場合は大文字が先、小文字が後となる。

p ["kumo", "yuki", "ame"].sort
p ["asa", "yuki", "ame"].sort
p ["asa", "Yuki", "ame"].sort

> ["ame", "kumo", "yuki"]
> ["ame", "asa", "yuki"]
> ["Yuki", "ame", "asa"]
大きい順に並び替える -reverse メソッド

reverseメソッドは配列の並び順を逆にする。

p [6, 10, 9].sort
p [6, 10, 9].sort.reverse

> [6, 9, 10]
> [10, 9, 6]
文字列を逆にする -reverse メソッド

reverseメソッドは配列のほか、文字列にも適応される。

p "abc".reverse
p "あいう".reverse

> "cba"
> "ういあ"

配列を文字列を変換する

join メソッド -配列中の文字列を連結する

join メソッドの使い方

joinメソッドは配列の要素の文字列を連結して、1 つの文字列にする。

puts ["コーヒー"].join
puts ["コーヒー", "ケーキ"].join
puts ["コーヒー", "ケーキ", "アイス"].join

> コーヒー
> コーヒーケーキ
> コーヒーケーキアイス

join("と")のように書くと、各要素の間に「と」を入れて連結する。
・要素が 1 つの場合は、「と」は入らない。

puts ["コーヒー"].join("と")
puts ["コーヒー", "ケーキ"].join("と")
puts ["コーヒー", "ケーキ", "アイス"].join("と")

> コーヒー
> コーヒーとケーキ
> コーヒーとケーキとアイス

split メソッド -文字列を分割して配列にする

split メソッド の使い方

splitメソッドは、スペースを区切り文字として文字列を分割し、それぞれの文字列を要素とした配列を返す。

p "コーヒー ケーキ アイス".split

> ["コーヒー", "ケーキ", "アイス"]

splitメソッド("と")のように区切り文字を渡すことで、スペース以外にも対応できる。

p "コーヒーとケーキとアイス".split("と")

> ["コーヒー", "ケーキ", "アイス"]

map メソッド -配列の各要素を変換する

map メソッド 配列の各要素を変換し、新しい配列を作る

mapメソッドは配列の各要素に処理を行い、変換してできた要素で新しい配列を作る。

配列.map do |変数|
  変換処理
end

例 1
mapメソッドへ変換処理をブロックで渡す。配列の各要素 1 6 9 に対して、ブロック処理のx * 2をそれぞれに実行する。結果の要素を持つ配列をresultへ代入する

result = [1, 6, 9].map do |x|   (x に 1 6 9 が順に代入される)
  x * 2   (変換処理)
end
p result

> [2, 12, 18]

例 2(分かりにくいので)
mapメソッド|text| text.reverse(変換処理)のブロックを渡し、各要素の文字列をreverseメソッドで逆順にする。

result = ["12345", "abc"].map do |text|
  text.reverse  (変換処理)
end
p result

> ["54321", "cba"]
map メソッド で要素をほかの種類のオブジェクトへ変換する

mapメソッドは、要素をほかの種類のオブジェクトへ変換することもできる。
mapメソッドへ渡したブロックは、各要素が代入される変数xを使い文字列"#{x}円"へと変換する。

result = [1, 6, 9].map do |x|   (x に 1 6 9 が順に代入される)
  "#{x}円"   (変換処理)
end
p result

> ["2円", "12円", "18円"]
map メソッドの短縮させた記載方法

mapメソッド|text| text.reverseのブロックを渡し、各要素の文字列をreverseメソッドで逆順にする。(通常の記載方法)

result = ["12345", "abc"].map do |text|
  text.reverse
end
p result

> ["54321", "cba"]

(短縮させた記載方法)変更点: do - end{ }にすることで 1 行で記載。

result = ["12345", "abc"].map{|text|text.reverse}
p result

> ["54321", "cba"]

ハッシュ(Hash)でオブジェクトを組で扱う

ハッシュ(Hash)とは?

ハッシュは複数のオブジェクトをまとめることができる入れ物。

・複数のデータを取り扱うことは配列と同じだが、ハッシュは「キー」「値」のセット
 で複数のデータを扱うことができる。

・配列のクラス名はArrayでしたが、ハッシュのクラス名はHashです。

ハッシュの使い方

・ハッシュには 2 つの書き方がある。

ハッシュのキーにシンボルを指定したとき

{キー: 値}    /   {キー: 値, キー: 値,・・・}

例: (メニューの商品と値段を表現したいとき)

{:coffee: 100}      /     {coffee: 100, cheese_cake: 300,・・・}

ハッシュのキーにシンボル以外を指定したとき

{キー => 値}     /   {キー => 値, キー => 値,・・・}

例: (" "で囲われた文字列など、シンボル以外の場合)

{"コーヒー" => 100}   /   {"コーヒー" => 100, "チーズケーキ" => 300,・・・}
シンボル(Symbol)とは?

例: (メニューの商品と値段を表現したいとき)

{:coffee => 100}

こちらのハッシュの場合:coffeeがシンボルになる。

:coffee
p メソッドへハッシュオブジェクトを渡す

pメソッドに渡すときに括弧を省略すると、文法の解釈が曖昧になりエラーになる。

p( {coffee: 100, cheese_cake: 300} )

> {coffee: 100, cheese_cake: 300}
ハッシュを変数に代入

ハッシュオブジェクトを作り、変数menuに代入する。

menu = {coffee: 100}
p menu

> {coffee: 100}
ハッシュから値を取得する
ハッシュ[キー]

例: ハッシュからキー:coffeeに対する値 100 を取得する。

menu = {coffee: 100, cheese_cake: 300}
p menu[:coffee]

> 100

存在しないキーを指定した場合はnilとなる

menu = {coffee: 100, cheese_cake: 300}
p menu[:ice]

> nil

存在しないキーを指定した場合の値をdefaultで設定できる

menu = {coffee: 100, cheese_cake: 300}
menu.default = 0    (キーがないときの値を設定)
p menu[:ice]

> 0
ハッシュへキーと値の組を追加する

キーと値は、末尾に追加される

menu = {coffee: 100, cheese_cake: 300}
menu[:ice] = 150
p menu

> {coffee: 100, cheese_cake: 300, ice: 150}

ハッシュに既にあるキーと同じものを追加しようとすると、新しいキーで上書きされる。

menu = {coffee: 100, cheese_cake: 300}
menu[:coffee] = 150
p menu

> {coffee: 150, cheese_cake: 300}
2 つのハッシュを 1 つにまとめる

coffee_menucake_menuをまとめて、新しいハッシュmenuを作る。

coffee_menu = {coffee: 100, coffee_latte: 200}
cake_menu = {short_cake:  300, cheese_cake: 300}
menu = coffee_menu.merge(cake_menu)
p menu

> {coffee: 100, coffee_latte: 200, short_cake:  300, cheese_cake: 300}
ハッシュからキーと値の組を削除する -delete メソッド

deleteメソッドで削除したい組のキーを指定する。(値は指定する必要なし)

ハッシュ.delete(キー)

例: deleteメソッドでキーのcheese_cakeを指定し、その組を削除する

menu = {coffee: 100, cheese_cake: 300}
menu.delete(cheese_cake)
p menu

> {coffee: 100}

ハッシュの要素を繰り返し処理する

ハッシュの要素を繰り返し処理

ハッシュの繰り返し処理の文法

ハッシュ.each do |キーの変数, 値の変数|
  繰り返し実行する処理
end

例: |key, value|と変数が 2 つになっている。1つ目の変数にキーが、2つ目の変数に値が代入されて繰り返し実行される。
(今回はキーと値がを表すkeyとvalueを使用したが自由に付けられる)

menu = {"コーヒー" => 100, "ケーキ" => 200}
menu.each do |key, value|
 puts "#{key}は#{value}円です"
end

> コーヒーは100円です
> ケーキは200円です

例: キーだけ繰り返したい場合はeach_keyメソッドを使う

menu = {"コーヒー" => 100, "ケーキ" => 200}
menu.each_key do |key|
 puts key
end

> コーヒー
> ケーキ

例: 値だけ繰り返したい場合はeach_valueメソッドを使う

menu = {"コーヒー" => 100, "ケーキ" => 200}
menu.each_value do |value|
 puts value
end

> 100
> 200

随時追加

GitHubで編集を提案

Discussion