Ruby Silver 練習問題2回目の振り返り

2022/02/05に公開

こんにちは。WEBエンジニアのホリさんです。
今回が第3回目の記事です。

概要

Ruby Silverの問題2回目を解いて、初めて知ったことについて共有させていただきます。

&&, ||, &, |

&& ・・・ 左辺がfalseの場合は、右辺の評価を無視する
|| ・・・ 左辺がtrueの場合は、右辺の評価を無視する
& ・・・ 左辺の評価関係なく、右辺の評価をする
| ・・・ 左辺の評価関係なく、右辺の評価をする

test1 = false
test1 && (raise "failed")
put "test"

=> "test"

定数の破壊的メソッド

警告を出さずに定数の値を変える方法

HOGE = "hoge"
HOGE.gsub!("hoge", "test")
print HOGE

=> "test"

?で文字列出力

?で文字列を出力

p  ?a
=> "a"

配列に&を使用する

配列に&を使用すると積を返す(共通な要素だけを返す)

a = [1,2,3]
b = [1,3,5]
c = a & b
p c
=> [1,3]

配列同士の+-

配列同士に+を使うと、配列の連結が行われる。逆に-を使うと右辺の配列の要素に該当する、左辺の配列の要素を削除する

a = [1,2,3]
b = [1,3,5]
c = [1,3,5]
p a + b - c
=> [2]

delete_ifとreject!

delete_ifは、要素を順番にブロックに渡して評価し、その結果が真になった要素をすべて削除します。
reject! はブロックを評価し、その値が偽であった要素を集めた新しい配列を返します.
rejectに!をつけると、該当する偽の値がなかった場合にnilを返します。

a = [0, 1, 2, 3, 4, 5]
a.delete_if{|x| x % 2 == 0}
p a 
=> [1, 3, 5]

a = [0, 1, 2, 3, 4, 5]
e = a.reject!
e.each{|i| i % 2 == 0}
p a 
=> [1, 3, 5]

shift

配列の先頭の要素を取り除いてそれを返します。引数を指定した場合はその個数だけ取り除き、それを配列で返します。unshiftは配列の先頭に要素を挿入するメソッドです。

a = [0, 1, 2, 3, 4]

p a.shift            
=> 0

p a                  
=> [1, 2, 3, 4]

p a.unshift(5)
=> [1, 2, 3, 4, 5]

p [].shift           #=> nil
p [].shift(1)        #=> []

compact

compactは自身からnilを取り除いた配列を生成して返す非破壊的メソッド。 compact!は自身から破壊的にnilを取り除き、nil要素がない場合はnilを返します。

ary = [1, nil, 2, nil, 3, nil]
p ary.compact   

=> [1, 2, 3]

p ary           
=> [1, nil, 2, nil, 3, nil]

ary.compact!

p ary           
=> [1, 2, 3]

p ary.compact!  
=> nil

indexで文字の位置検索

indexの第1引数に検索したい文字、第2引数に検索開始位置を設定します。(5の場合、6番目になるのでtから開始)

p "test!test!test!test!".index("!", 5)

=> 9

文字列deleteメソッド

Stringクラスのdeleteメソッドは、引数に含まれる文字を文字列から取り除きます。
^で始まる場合は、その文字列以外を削除します。
文字列の間に-を入れると2-5の場合は、2345を指しています。

p "012345678-".delete("^12-5-")

=> "12345-"

まとめ

配列をどうやって、整形するかこのRuby問題でかなり学べました。
現場では、そこまで使わないかもですが選択肢が多くなることはいいことなので、日頃からキャッチアップを継続していこうと思いました。

参考URL

https://docs.ruby-lang.org/ja/latest/method/Enumerable/i/reject.html
https://docs.ruby-lang.org/ja/latest/method/Array/i/delete_if.html
https://docs.ruby-lang.org/ja/latest/method/Array/i/compact.html

Discussion