大ちゃんの駆け出し技術ブログ

RUNTEQ受講生のかわいいといわれるアウトプットブログ

【無職に転生 ~ 就職するまで毎日ブログ出す_29】【Rails】Integerクラスのメソッド

はじめに

こんにちは、大ちゃんの駆け出し技術ブログです。

タイトルにあるとおり【無職に転生 ~ 就職するまで毎日ブログ出す】というチャレンジをしています!!!!昨日までは就活するまで本気出すでしたが、これだとまるで就活後は頑張らないのかと思われてしまいそうで、、、大人気アニメのタイトルのまるパクリチャレンジです。

https://i.gyazo.com/3a02b7aae4e5e538130d4bb199b55dc7.png

RailsやらRubyやらSQLやらその他Webの知識やらが色々と抜け落ちているのを感じており、知識の定着のためにもアウトプットする機会を増やすためです。加えて、退職して文字通り無職に転生しましてプロニートになり、毎日時間に余裕ができたので引き締めるためにも毎日投稿を思い至りました!

【投稿内容】

  • SQLの難しい処理 (副問合せ、JOINとか複雑な処理が書けない)
  • Rails全般 (純粋に必要な知識が多すぎる、網羅的な理解が足りない)
  • Rubyのあまり使わないメソッドや記述方法 (あまり重要ではないけど特に)
  • Web知識全般 (クッキーやら、セッションやらなんとなくで理解しているものの自分の言葉で説明できない)
  • 書籍 (スタートアップ企業に勤めるので、自分が会社に与える影響やパフォーマンスを高めるためビジネス書を読んでいきます。)

本日やること

今日は久しぶりにメソッド紹介です。前まではArrayクラスやEnumerableモジュールのメソッドを紹介していて配列に関するメソッドはだいぶ覚えたのですが、数値に関するメソッドは意外と覚えていないということで、ここでしっかりと覚えていきたいと思います。ちなみに競技プログラミングなどで数値を扱うタイミングは頻繁にあるので、覚えておくと応用が聞いて便利だと思います。

Integerクラスのメソッドの種類

公式では以下のように記載されていました。当然ですが演算系メソッドが多く定義されています。

https://i.gyazo.com/5f5ea4e8540e1d4fff09e95d4b79ac5d.png

class Integer

Integer#times

レシーバーの数値の数だけ繰り返し処理を行うことができるメソッドです。

5.times { puts "出力!" }
出力!
出力!
出力!
出力!
出力!
=> 5

競技プログラミングだと死ぬほど使います。例えば、mapメソッドと組み合わせてN回分の配列の組み合わせを取得する時などです

N = gets.to_i
N.times.map {gets.split.map(&:to_i)}
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
=> [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]

これは知らなかったのですが、レシーバーの数値が0以下の数値(0, -1, -2,...)の時は何も出力されず、レシーバーの数値をそのまま返却します。

1.times {puts "a"}
a # 出力
=> 1 # 返り値
-1.times {puts "a"}
=> -1 # 返り値

Integer#<=>

左辺と右辺の値を比較しそれぞれの結果に従った値を返却します。

左辺が右辺より大きい場合 ⇒ 1を返す

5<=>4
=> 1

右辺が左辺より大きい場合 ⇒ -1を返す

4<=>5
=> -1

左辺等辺が同値の場合 ⇒ 0を返す

5<=>5
=> 0

比較できない場合 ⇒ nilを返す

5<=>"5"
=> nil

Arrayクラスのメソッドでもほぼ同様の挙動で定義されているようです。

[1,2,3] <=> [1,2,3]
=> 0

Integer#abs

引数の絶対値を返すメソッドです。

2.abs
=> 2
-2.abs
=> 2

挙動としてはこれだけです。

関連メソッドでNumericクラスからの継承でabs2というメソッドがあります。これは絶対値を二乗した数を返しています。

2.abs2
=> 4
-2.abs2
=> 4

以下のようにabsのまま書くことも可能です。

2.abs ** 2
=> 4

Integer#digits(base)

baseを基準にしてレシーバーの数値を桁で区切って逆順にして配列にするメソッドです。baseは進数を指定します。つまり2や10、16が入ります。デフォルトでは10となっています。

少し説明では挙動がわかりにくいので実際に見てみましょう。

18.digits
=> [8, 1]
18.digits(2)
=> [0, 1, 0, 0, 1]
18.digits(16)
=> [2, 1]

まず引数を指定しない場合ですが、その場合はbaseが10となり10進数を基準にして配列になります。18は10進数で表されているのでそのまま18で考えます。18は桁で区切ると1と8ですね。これを逆順にして配列にすると[8, 1]になります。

次に引数が2と指定されている場合、18は二進数で10010です。これを桁区切りにしてそれを逆順にすると[0, 1, 0, 0, 1]となります。

16進数についても同様の考え方です。ただし、A、Bなどの表記はされずにそのアルファベットが表す数値となるようです。例えば、31を16進数にすると1Fですが、Fは数値として扱われるので15となります。

31.digits(16)
=> [15, 1]

Integer#lcm

レシーバーの数値と引数の数値の最小公倍数を求めます。最小公倍数はお互いの数値の倍数で共通の値になる最小の数です。

5.lcm(7)
=> 35

Integer#gcd

レシーバーの数値と引数の数値の最大公約数を求めます。最大公約数はお互いの数値を割り切ることができる最大の数です。

5.gcd(7)
=> 1

Integer#gcdlcm

gcdとlcmの挙動を一度に行ってくれるメソッドです。0のインデックスにはgcdの値が、1のインデックスにはlcmの値が格納されます。

5.gcdlcm(7)
=> [1, 35]

Integer#upto

レシーバーの数値から引数の数まで繰り返し処理を行うメソッドです。これはtimesとほぼ同じように扱うことができますが、インデックス番号を指定することができる点が強みです。例えば、timesの場合は0からレシーバーの数値-1のインデックス番号を繰り返し処理で使うことができます。

5.times {|i| puts i }
0
1
2
3
4
=> 5

しかし、インデックス番号を1からスタートさせたい場合もあると思います。その時にuptoメソッッドを以下のようにして使うことができます。

1.upto(5)  {|i| puts i }
1
2
3
4
5
=> 1

引数の条件としては必ずレシーバーより大きい値である必要があります。もし、レシーバーの値が大きい場合、繰り返し処理は行われずにレシーバーが返却されます。

1.upto(-5)  {|i| puts i }
=> 1

Integer#downto

downtoはuptoの逆の挙動です。レシーバーの数値から値の小さい引数まで繰り返し処理を行うメソッドです。

1.downto(-5)  {|i| puts i }
1
0
-1
-2
-3
-4
-5
=> 1

終わりに

毎日投稿も29日目!めちゃくちゃ続いたなと思います!ここだけの話ですが、もう実は内定を一社いただいておりまして就職するまでを期限としたこのブログ投稿ももう直ぐ終わりです。ですが、これからもブログは続けていきたいと思っているので是非ともご愛読よろしくお願いします。

ちなみにこの毎日投稿チャレンジが終わり次第本ブログへの投稿は終わりにしようと思います。このはてなブログでの投稿を終わらせ個人ブログサイトを作ってそこに投稿していこうと考えているのでよろしくお願いします。