Ruby入門 part11
Ruby入門、標準ライブラリについての続きです🎈
これでRuby入門は最後になります!長かった〜!
この記事もそれなりに長いです😂笑
目次
1.配列(Array)クラス
1-1. 要素の置き換え、追加
配列オブジェクトについてはこちらの記事で学習したとおりですが、インデックスという数値を使って他のオブジェクトを管理できるものでした💡
インデックスは先頭の要素を 0 として、1, 2, 3, ... と増えていくものでした。
そして、配列に含まれる要素を取得するには次のように行います。
1つの要素を取得する方法と、複数の要素を配列として取得する方法を続けて記載いたします。
変数名 = 配列オブジェクト名[インデックス]
新しい配列オブジェクト名 = 配列オブジェクト名[開始位置..終了位置]
また、配列に含まれる要素を別の要素に置き換えることもできます。
配列オブジェクト名[インデックス] = 新しい要素
配列オブジェクト名[開始位置..終了位置] = 新しい要素
配列オブジェクト名[開始位置, 要素の数] = 新しい要素
要素を追加するには、上記の3つめの方法を応用して、引数の「要素の数」を0にすることで、開始位置に新しい要素を追加できます✨
これまでの解説をまとめて実際にやってみました!
gist.github.com
結果は以下のとおりです。
1-2. 配列の平滑化
配列オブジェクトの中の要素に他の配列があるとき、中の配列を展開して平滑化することができます。
Arrayクラスで用意されているflatten
メソッドを使います。
配列オブジェクト名.flatten
具体的には以下のようになります。
ここでは、配列の中のひとつの要素に["塩", "胡椒"]
という配列が入っていますが、これを展開して平滑化しています🌝
gist.github.com
結果は以下のようになります。
1-3. 要素を取り除くメソッド
ここからは要素を取り除くメソッドをいくつか紹介します。
メソッド | 動作 | 備考 |
---|---|---|
uniq | 重複要素を取り除いて配列を作成 | |
uniq! | 重複要素を取り除いて配列を上書き | |
compact | nilの要素を取り除いて配列を作成 | |
compact! | nilの要素を取り除いて配列を上書き | |
delete | 指定した値と等しい要素を取り除いて上書き | 引数あり |
delete_at | 指定したインデックスの要素を取り除いて上書き | 引数あり |
delete_if | ブロック内の処理結果がtrueの要素を取り除いて上書き | 解説後述 |
沢山ありますね!!
delete_if
は、以下のように書くことができます。reject
も同様です😊
配列オブジェクト名.delete_if {|x|
実行する処理
}
uniq
のように新しく配列を作成するメソッドに対して、delete
のように自身を上書きするメソッドを破壊的メソッドといいます。
新しく作成するメソッドなのか、上書きするメソッドなのかを把握しながら実行しないと、予期せぬ戻り値になります笑
ちなみにわたしはdelete
が新規作成メソッドだと思いこんでいたら、取り除きたい値だけが戻り値になって返ってきてしまい、苦戦しました😂
ひとつひとつ試していきます!
結果は以下のとおりです。
1-4. 並び替えメソッド
削除の次は、要素を並び替えるために使えるメソッドを紹介します😋
メソッド | 動作 | 備考 |
---|---|---|
reverse | 要素を逆順に並び替えて配列を作成 | |
reverse! | 要素を逆順に並び替えて配列を上書き | |
sort | 要素を一定の規則でソートして配列を作成 | 解説後述 |
sort! | 要素を一定の規則でソートして配列を上書き | |
transpose | 配列を行列とみなす(行と列を入れ替える) | 解説後述 |
sort
メソッドは、以下のようにブロックを使ってソートする方法を指定することができます。
Arrayオブジェクト.sort {|a, b|
aとbを使った比較の方法
}
なお、比較方式を指定しない場合には各要素を<=>
メソッドが使われます。この場合、要素は小さい順に並べ替えられます。
transpose
メソッドは、配列(左から右へ)を行列(上から下へ)として入れ替えるメソッドです。
行と列が入れ替わるというイメージですね😶
これらを実際に試してみます!
結果は以下のとおりです。
2.ハッシュ(Hash)クラス
ハッシュについてはこちらの記事で学習しましたが、他にもHashクラスで使えるメソッドがあるので紹介します💡
メソッド | 動作 | 備考 |
---|---|---|
delete | 指定したキーに対応する値を取り除いて上書き | 解説後述 |
delete_if | ブロック内の処理結果がtrueのキーと対応する値を取り除いて上書き | 解説後述 |
reject! | 同上 | |
relect | ブロック内の処理結果がtrueのキーと対応する値を取り除いたハッシュを作成 | |
clear | ハッシュを空の状態にする |
先程も出てきたdelete
系のメソッドがHashクラスにも用意されていますね〜😐
指定したキーに対応する値を、ハッシュ自身から取り除きます。破壊的メソッドですね🔥
戻り値は削除された値になります。
delete
メソッドでは、指定したキーが存在しない場合の処理をブロックに指定することもできます!
ハッシュオブジェクト名.delete(キー) {|key|
...
}
delete_if
メソッドは次のように書くことができます。
同じ動作をするreject!
メソッドも同様です👌
ハッシュオブジェクト名.delete_if {|key, value|
...
}
実際にやってみます!
gist.github.com
結果は以下のとおりです。
3.時刻(Time)クラス
3-1. Timeオブジェクトの作成
今度は初登場のTime
クラスです。時刻を扱うクラスですね🕑
Time
クラスから作成できるTime
オブジェクトには、起算時と呼ばれる時刻から現在までの経過秒数を持っています。
起算時は、一般的には1970年1月1日午前0時です。
なぜかというのはちょっと調べてみただけではよく分かりませんでしたが、世界的な基準やらUNIXのシステムやらがそうなっているらしいです😶
Timeオブジェクトを作成するには、おなじみnew
メソッドを使います。
Timeオブジェクトを格納する変数 = Time.new
new
メソッドの他にnow
メソッドを使うこともできます。
Time
クラスには、オブジェクトの経過秒数から時刻を構成する要素を取り出すメソッドがいくつか用意されています。
メソッド | 動作 |
---|---|
sec | 秒を整数で取得 |
min | 分を整数で取得 |
hour | 時を整数で取得 |
day | 日を整数で取得 |
mday | 同上 |
month | 月を整数で取得 |
mon | 同上 |
year | 年を整数で取得 |
wday | 曜日を0(日)から6(土)の整数で取得 |
yday | 1月1日からの通算日を整数で取得 |
isdst | 夏時間があるなら true |
dst? | 同上 |
zone | タイムゾーンを表す文字列を取得 |
沢山ありますね😳
これらを組み合わせてプログラムを書いてみました!
結果は以下のとおりです。
実行した時の時刻が表示されました!🎉
現在時刻ではなく、指定した日時を表すTime
オブジェクトを作成するには、Time
クラスで用意されているlocal
メソッドを使います。また、mktime
メソッドを使っても同じです。
local
メソッド(またはmktime
メソッド)の引数には以下の2種類があります。
Time.local(year, month, day, hour, min, sec, usec)
Time.local(sec, min, hour, day, month, year, wday, yday, isdst, zone)
ひとつめの引数は、年、月、日、時間、…という順で作っていきます。usec
はマイクロ秒のことです😊
途中から省略することもでき、その場合は省略された引数には取り得る最小値が代入されます。
ふたつめの引数は、秒、分、時間、…という順です。
こちらは引数を省略できず全て指定するのですが、wday, yday, zone
は設定しても無視されるようです笑
isdst
はサマータイムの有無を指し、値はtrue
またはfalse
です。
3-2. Timeオブジェクトを文字列として取得
Time
オブジェクトを指定したフォーマットで文字列として取得するには、Time
クラスで用意されているstrftime
メソッドを使います。
変数 = Timeオブジェクト名.strftime(フォーマット文字列)
引数のフォーマット文字列とは、出力したい形式を表す文字列です。以下のような特別な文字列を使って指定することができます。
フォーマット文字列 | 出力形式 | 出力例 |
---|---|---|
%A | 曜日 | Sunday, Monday, ... |
%a | 曜日の省略形 | Sun, Mon, ... |
%B | 月(文字) | January, February, ... |
%b | 月(文字)の省略形 | Jan, Feb, ... |
%c | 日付と時刻 | |
%d | 日 | 01 〜 31 |
%H | 24時間制の時 | 00 〜 23 |
%I | 12時間制の時 | 01 〜 12 |
%j | 年中の通算日 | 001 〜 366 |
%M | 分 | 00 〜 59 |
%m | 月(数字) | 01 〜 12 |
%p | 午前または午後 | AM,PM |
%S | 秒 | 00 〜 60 (60はうるう秒) |
%U | 週番号(最初の日曜日が第1週) | 00 〜 53 |
%W | 週番号(最初の月曜日が第1週) | 00 〜 53 |
%w | 曜日を表す数(日曜日が0) | 0 〜 6 |
%X | 時刻 | |
%x | 日付 | |
%Y | 西暦 | |
%y | 西暦の下2桁 | 00 〜 99 |
%Z | タイムゾーン | |
%% | %自身 |
沢山あって、覚えるのは難しそうですね💦
実際にやってみると、次のようになります。
gist.github.com
結果は以下のとおりです。
3-3. 時刻の取得
Time
クラスには、時刻を取得するためのメソッドがいくつかあります。
メソッド | 動作 | 備考 |
---|---|---|
to_a | Timeオブジェクトの各要素を配列として取得 | 解説後述 |
to_f | 起算時からの経過秒数を浮動小数点数で取得 | |
to_i | 起算時からの経過秒数を整数で取得 | |
tv_sec | 同上 | |
utc_offset | 現在のタイムゾーンと協定世界時との時差を取得 | |
gmt_offset | 同上 | |
gmtoff | 同上 |
to_a
メソッドで取得できる時刻の要素は、次の順番で配列に格納されます。
[sec, min, hour, mday, month, year, wday, yday, isdst, zone]
これらを実際に試してみました!
gist.github.com
結果は以下のとおりです。
4.日付(Date、DateTime)クラス
4-1. Dateクラス
Date
クラスは日付を扱うクラスですが、Ruby公式では推奨されていないらしいです。将来的になくなるとか🧐
Date
クラスは組み込みクラスではないため、Date
クラスを使うにはまずプログラムファイルの中で次の一文を記述する必要があります。
require "date"
Date
クラスのオブジェクトを作成するには、new
メソッドを使って年月日を指定するか、today
メソッドを使って本日の日付を取得する方法があります。
Date.new(year, month, day)
Data.today
Data
クラスのオブジェクトはTime
オブジェクトと同様に、day
メソッドなどを使って時刻を取得したり、フォーマット文字列を使って文字列を取得することができます。
4-2. DateTimeクラス
DateTime
クラスはDate
クラスのサブクラスで、Date
クラスの年月日に加え、時分秒を扱うことができます💡
DateTime
クラスも当然組み込みクラスではないため、始めにプログラムファイルの中でrequire "date"
を記述する必要があります。
DateTime
クラスのオブジェクトを作成するには、new
メソッドで任意の時間を指定するか、now
メソッドで現在の時刻を取得します。
Date.new(year, month, day, hour, min, sec, offset)
DateTime.now([start])
offset
は、協定世界時との時差を指定します。単位は日
です🌞
例えば、日本の時差(9時間)を表すには9[時間] / 24[時間]
日の0.375
日となります。
Ruby入門、以上です!長々ありがとうございました😆