...

Ruby技術者認定試験に出やすい「!」の付かない破壊的メソッド一覧

Rubyの破壊的メソッド

Ruby技術者認定試験で問われやすい破壊的メソッドに関連する問題。

一般的に破壊的メソッドは「!」が付いていますが、例外(付いてないのに破壊的)のメソッドも存在します。

よってどのメソッドが破壊的かをある程度頭の中に入れておく必要があります。

そこで今回は…

「!」の付かない破壊的メソッドって何があるん?

という方に向けて、Ruby技術者認定試験に出やすい「!」の付かない破壊的メソッドをまとめました。

でぜひ参考にしてみてくださいね⸝⸝- ̫ -⸝⸝

ブログ主

早速いってみよう!

Rubyの破壊的メソッドとは?

「そもそも破壊的メソッドとは何ぞや?」となる方に向けて。具体的な例から見ていきましょう。(既に知っている方はこちらに飛んでください)

まずは対になる非破壊的メソッドについてから。

非破壊的メソッド

array=["三種の","チーズ牛丼","特盛","温玉付き"]

#非破壊的メソッドの場合
array.slice(2..3)
p array #=>["三種の", "チーズ牛丼", "特盛", "温玉付き"]

配列から要素を取り出してくれるsliceですが、あくまでもsliceは取り出した要素を返してくれるだけで、このようにその配列自体をいじるわけではありません。

なので上のようにsliceを呼び出した後に配列を出力しても配列は元のまま。

このようなメソッドを非破壊的メソッドと呼びます。

 

破壊的メソッド

array=["三種の","チーズ牛丼","特盛","温玉付き"]

#破壊的メソッドの場合
array.slice!(2..3)
p array #=>["三種の", "チーズ牛丼"]

しかし「slice!」というメソッドも存在します。sliceとは違って、呼び出した後に出力してあげるとその配列の要素が削除されていますね。

このようにそのオブジェクト自体を変えてしまうメソッドのことを破壊的メソッドと呼びます。

破壊的メソッドの多くは「!」が付いており、メソッド名だけで破壊的であると判断できることが多いです。

ブログ主

全てのメソッドが「!」をつけたら破壊的メソッドになるわけではないよ

しかししかし…

「!」が付かない破壊的メソッドも

array=["三種の","チーズ牛丼","特盛","温玉付き"]

array.delete_at(1)
p array #=>["三種の", "特盛", "温玉付き"]
あれ?「!」が付いてないのにオブジェクトが変わってる…

ソロモン

となりますよね。そう、このように「!」が付かない破壊的メソッドも存在します。

「!」の付かない破壊的メソッドまとめ

そんな「!」の付かない破壊的メソッドで、Ruby技術者認定試験で頻出のものをまとめました

Stringクラス

concat<<insert
[]=replace

ブログ主

各メソッドの簡単な説明をするよ
s="RubyとPythonとJavaScript"
s.concat("とPHPだよ")
p s #=>"RubyとPythonとJavaScriptとPHPだよ"
s="RubyとPythonとJavaScript"
s<<("とPHPだよ")
p s #=>"RubyとPythonとJavaScriptとPHPだよ"

concatメソッドと<<メソッドは引数で指定した文字列を結合します。


s="RubyとPythonとJavaScript"
s.insert(-1,"とPHPだよ")
p s #=>"RubyとPythonとJavaScriptとPHPだよ"

insertメソッドは引数で指定した所に文字列を挿入します。


s="RubyとPythonとJavaScript"
s[-1]=("tとPHPだよ")
p s #=>"RubyとPythonとJavaScriptとPHPだよ"
[]=メソッドは引数で指定した所の文字を置き換えます。


s="RubyとPythonとJavaScript"
p s.object_id #=>70101500678680
s.replace("RailsとReact")
p s.object_id#=>70101500678680
p s #=>"RailsとReact"

replaceメソッドはその文字列自体を指定した文字列に置き換えます。

あくまで置き換えなので同じオブジェクトのままです。

Arrayクラス

popshiftunshift
push<<concat
insert[]==fill
replacedeletedelete_at
delete_ifclear

ブログ主

どんなメソッドなのか見ていこう
a=["Ruby","Python","JavaScript"]
a.pop
p a #=>["Ruby", "Python"]

popメソッドは配列の末尾の要素を削除します。


a=["Ruby","Python","JavaScript"]
a.shift
p a #=>["Python", "JavaScript"]

shiftメソッドは配列の先頭の要素を削除します。


a=["Ruby","Python","JavaScript"]
a.unshift("PHPだよ")
p a #=>["PHPだよ", "Ruby", "Python", "JavaScript"]

unshiftメソッドは引数に指定した要素を配列の先頭に追加します。


a=["Ruby","Python","JavaScript"]
a.push("PHPだよ")
p a #=>["Ruby", "Python", "JavaScript", "PHPだよ"]
a=["Ruby","Python","JavaScript"]
a<<("PHPだよ")
p a #=>["Ruby", "Python", "JavaScript", "PHPだよ"]

pushメソッドと<<メソッドは、引数に指定した要素を配列の末尾に追加します。


array=["Ruby","Python","JavaScript"]
array.concat(["PHPだよ"])
p array #=>["Ruby", "Python", "JavaScript", "PHPだよ"]

concatメソッドは引数に指定した配列を結合します。


array=["Ruby","Python","JavaScript"]
array.insert(1,"PHPだよ")
p array #=>["Ruby", "PHPだよ", "Python", "JavaScript"]

insertメソッドは引数で指定した所に要素を挿入します。


a=["Ruby","Python","JavaScript"]
a[-1]="PHPだよ"
p a #=>["Ruby", "Python", "PHPだよ"]
[]=メソッドは引数で指定した所の要素を書き換えます。


a=["Ruby","Python","JavaScript"]
a.fill("PHPだよ")
p a #=>["PHPだよ", "PHPだよ", "PHPだよ"]

fillメソッドは配列の全要素を引数で指定した要素に変えます。


a=["Ruby","Python","JavaScript"]
p a.object_id #=>70104977327660
a.replace(["Rails,React"])
p a.object_id #=>70104977327660
p a #=>["Rails,React"]

replaceメソッドはその配列自体を指定した配列に置き換えます。

あくまで置き換えなので同じオブジェクトのままです。


a=["Ruby","Python","JavaScript"]
a.delete("Ruby")
p a #=>["Python", "JavaScript"]

deleteメソッドは引数で指定した要素を配列から削除します。


a=["Ruby","Python","JavaScript"]
a.delete_at(0)
p a #=>["Python", "JavaScript"]

delete_atメソッドは引数で指定したインデックスの要素を配列から削除します。


a=["Ruby","Python","JavaScript"]
a.delete_if do |x| x=~/^R/ end
p a #=>["Python", "JavaScript"]

delete_ifメソッドは引数のブロックの条件を満たす要素を配列から削除します。


a=["Ruby","Python","JavaScript"]
a.clear
p a #=>[]

clearメソッドは配列を空にします。

 

Hashクラス

shift[]=replace
updatedeletedelete_if
clear

ブログ主

見ていこう
h={Ruby:"るびー",Python:"ぱいそん",JavaScript:"じゃばすくりぷと"}
h.shift
p h #=>{:Python=>"ぱいそん", :JavaScript=>"じゃばすくりぷと"}

shiftメソッドはハッシュの先頭のキーと値を削除します。


h={Ruby:"るびー",Python:"ぱいそん",JavaScript:"じゃばすくりぷと"}
h[:Ruby]="ルビー"
p h #=>{:Ruby=>"ルビー", :Python=>"ぱいそん", :JavaScript=>"じゃばすくりぷと"}
[]=メソッドは指定したキーの値を書き換えます。


h={Ruby:"るびー",Python:"ぱいそん",JavaScript:"じゃばすくりぷと"}
p h.object_id #=>70120001276640
h.replace({Rails:"れいるず",React:"りあくと"})
p h.object_id #=>70120001276640
p h #=>{:Rails=>"れいるず", :React=>"りあくと"}

replaceメソッドはそのハッシュ自体を指定したハッシュに置き換えます。

あくまで置き換えなので同じオブジェクトのままです。


h={Ruby:"るびー",Python:"ぱいそん",JavaScript:"じゃばすくりぷと"}
h.update({Rails:"れいるず",Ruby:"ルビー"})
p h #=>{:Ruby=>"ルビー", :Python=>"ぱいそん", :JavaScript=>"じゃばすくりぷと", :Rails=>"れいるず"}

updateメソッドは引数で指定したハッシュと結合させます。

既存のキーと同じものがある場合更新されます。


h={Ruby:"るびー",Python:"ぱいそん",JavaScript:"じゃばすくりぷと"}
h.delete(:Ruby)
p h #=>{:Python=>"ぱいそん", :JavaScript=>"じゃばすくりぷと"}

deleteメソッドは引数で指定したキーの要素を削除します。


h={Ruby:"るびー",Python:"ぱいそん",JavaScript:"じゃばすくりぷと"}
h.delete_if do |key,value| key=~/^R/ end
p h #=>{:Python=>"ぱいそん", :JavaScript=>"じゃばすくりぷと"}

delete_ifメソッドはブロック内の条件を満たす要素を削除します。


h={Ruby:"るびー",Python:"ぱいそん",JavaScript:"じゃばすくりぷと"}
h.clear
p h #=>{}

clearメソッドはハッシュを空にします。

気をつけておきたいコト

返り値

ブログ主自身が試験において何度も引っ掛かったことなのですが…

a=["Ruby","Python","JavaScript"]
p a.delete("Ruby") #=>"Ruby"

破壊的メソッドにはちょくちょく、返り値がその変更したオブジェクトではないものがあります。

例えばdeleteメソッド。ここでは消した要素が返っていますね。

よく間違えがちなのでこの辺りも留意しておくといいかもしれません。

Stringクラスのdeleteメソッド

s="貧乳は正義"
s.delete("は正義")
p s #=>"貧乳は正義"

これもブログ主自身がよく引っ掛かった内容です。

ArrayクラスとHashクラスのdeleteメソッドは破壊的ですが、Stringクラスのdeleteメソッドは非破壊的なのでご注意ください。

最後に

以上となります。

上で挙げた「!」の付かない破壊的メソッドを覚えておけば「このメソッドは!が付かないかぎり破壊的ではないよね」とメソッドを見ただけで判断できるようになるので、

破壊的か否かの判断が簡単になり試験勉強が一段階楽になりますね

試験に関してはこちらの記事でまとめてます

ソロモン

Ruby技術者認定試験silverの勉強法と出題問題Ruby技術者認定試験Silverに合格したので出題された問題とか勉強方法とかまとめたよ

 

参考になれば幸いです!では⸝⸝- ̫ -⸝⸝

参考になったらシェアしよう

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA