ローイングファンのプログラミング日記

ボート競技やプログラミングについて書きます

配列に使えるメソッド

配列に使えるメソッドを試してみる。

目次


インスタンスメソッド

これまでに試したputsメソッドや+メソッドのつかい方は、どちらかというと特殊。
多くのメソッドは次のように使う。

オブジェクト.メソッド(引数)


オブジェクトとメソッドをピリオドで結ぶことでオブジェクトに指示を出す。
引数とは、より詳しい指示のようなもの。
メソッドによっては引数がいらないものもある。逆に複数の引数が必要なものもある。

オブジェクトは所属のクラスによって振る舞い方が決められている。
メソッド名が同じだとしても、はたらきかけるオブジェクトの所属するクラスによっては動きが異なることもある。

Rubyでは全てのデータがオブジェクト。それらオブジェクトは何らかのクラスに所属している。
クラスに所属しているオブジェクトのことを「クラスのインスタンス」と呼ぶこともある。
インスタンスにつけて使うメソッドのことをインスタンスメソッドと言う。

クラス、オブジェクト、インスタンスの話は難しい。
理解できなくても簡単なコードは書けるので、とにかくコードを書く。
徐々に理解を深めていけば問題ない。

メソッドの調べ方

Rubyには便利なメソッドがたくさんある。
Rubyリファレンスマニュアルにはクラス別にインスタンスメソッドの説明がある。
配列クラスのインスタンスメソッドについては次のURLを参照。

Rubyリファレンスマニュアル
Arrayクラス インスタンスメソッド
https://docs.ruby-lang.org/ja/latest/class/Array.html

size、insert

配列オブジェクトに使えるインスタンスメソッドを試す。
まずsizeとinsertメソッド。

test.rb

crews = ["N会社", "M大学", "C大学", "N大学"]
p crews
p crews.size
crews.insert(1,"CB電力")
p crews
p crews.size


実行結果

["N会社", "M大学", "C大学", "N大学"]
4
["N会社", "CB電力", "M大学", "C大学", "N大学"]
5


コードの説明。

  • 配列をつくって変数crewsに代入する
  • pメソッドでcrewsの詳細を出力する
  • sizeメソッドで要素の数がいくつあるのか数える
  • insertメソッドで配列に要素を追加する
    • 引数は2つとる
      • 第1引数でインデックスを指定
      • 第2引数に追加するオブジェクトを記入
  • 追加できたかどうかpメソッドで確認する
  • 再びsizeメソッドで要素数を調べる
    • 4から5に増えている


eachメソッド

eachメソッドは配列の要素を1つずつ取り出す。
試しにコードを書く。

test.rb

crews = ["N会社","M大学","C大学","N大学"]
crews.each do |crew|
    puts crew
end


実行結果

N会社
M大学
C大学
N大学


コードの説明。

  • 4つの要素を持つ配列をつくる
  • eachメソッドで配列の要素を1つずつ取りだす
  • putsメソッドで取りだした要素を出力していく


eachメソッドにつづくdoからendまでの書式をブロックと言う。
ブロックの中には、まず変数を書く。
| |で囲まれたオブジェクトが変数。ブロック変数という。
このブロック変数に配列から取り出された要素が代入されていく。

ブロック変数のあとに実行させたい処理を書く。
今回の場合は、putsメソッドでターミナルに表示させる、ということになる。

動き方は、まずeachメソッドが配列の要素を1つ取り出す。
取り出された要素がブロック変数に代入される。
あとはendまで書かれたコードのとおりに動く。
動作は要素がなくなるまで(要素の数だけ)繰り返される。

改行と字下げ(インデント)はコードが見やすくなるためにいれている。
必須ではないけれど通常は改行や字下げをいれる。



配列には配列も格納できる。
配列の配列にeachメソッドを使ってみる。

test.rb

#順位毎の結果を配列にまとめ、更にそれらの配列を1つの配列に格納する
#できた配列を変数resultsに代入する
results = [
    [1,"N会社","05:47.74"],
    [2,"M大学","05:51.44"],
    [3,"C大学","05:53.49"],
    [4,"N大学","05:57.27"]
]

#resultsから順位毎の配列を取り出す
results.each do |result|
    p result
end


実行結果

[1, "N会社", "05:47.74"]
[2, "M大学", "05:51.44"]
[3, "C大学", "05:53.49"]
[4, "N大学", "05:57.27"]


配列の配列も見やすくするため改行と字下げをいれた。
pメソッドの結果から、順位毎の配列が取り出せているのがわかる。

eachメソッドで取りだしたオブジェクトをターミナル/PowerShellに出力する

配列から配列を取りだし、取りだした配列からインデックスを使って要素を取り出す。

rubylesson.rb

#レース情報を変数に代入する
month_day_time = "10/29 10:10"
event = "女子ダブルスカル"
group = "決勝"

#順位毎の結果を配列にまとめ、更にそれらの配列を1つの配列に格納する
#できた配列を変数resultsに代入する
results = [
    [1,"N大学","07:24.97"],
    [2,"W大学","07:32.13"],
    [3,"M生命","07:33.61"],
    [4,"T大学","07:37.57"]
    ]

#情報を出力する
puts month_day_time #日時の出力
puts "#{event} #{group}" #種目と組別の出力
results.each do | result | #順位毎のレース結果がブロック変数resultに代入される
    #レース結果をインデックスで呼び出し、ターミナルに出力する
    puts "#{result[0]}#{result[1]} #{result[2]}" #要素がなくなるまで繰り返される
end


実行結果

10/29 10:10
女子ダブルスカル 決勝
1着 N大学 07:24.97
2着 W大学 07:32.13
3着 M生命 07:33.61
4着 T大学 07:37.57


eachメソッドを使えば、たくさんデータをたくわえても、あと処理の心配がなくなる。

次回は条件判断について試す。


今回の動作確認環境

Ruby 2.4.3p205

macOS 10.13.3
ターミナル

Windows10
Windows PowerShell