んなまにのメモ帳

気が向いたときに更新されます。

RubyのArray#delete, Hash#delete, String#deleteの違い

delete メソッドは、Array、String、Hashクラスに用意されていて、動きを整理しておきたい。

Array#delete

引数に一致する配列の要素を削除し、削除したオブジェクトを返す。
メソッド名に!が付いていないけど、元の配列に対して変更を加えるため、破壊的な操作をするメソッドになっている。

>> a = %i(a b c d)
=> [:a, :b, :c, :d]
>> a.delete :b
=> :b
>> a
=> [:a, :c, :d]

Hash#delete

引数に一致するkeyの要素を削除し、削除したvalue値を返す。
こちらも配列同様、メソッド名に!が付いていないけど、元のHashに対して変更を加えるため、破壊的な操作をするメソッドになっている。

>> h = {a: 'hoge', b: 'huga'}
=> {:a=>"hoge", :b=>"huga"}
>> h.delete :b
=> "huga"
>> h
=> {:a=>"hoge"}

String#delete, String#delete!

引数として渡した文字列に含まれる全ての文字を、文字列から削除する。
戻り値は、削除後の文字列を返す。
破壊的なメソッドのdelete!もある。

# delete
>> s = "hello, world"
=> "hello, world"
>> s.delete("l")
=> "heo, word"
>> s.delete("lo")
=> "he, wrd"
>> s
=> "hello, world"

# delete!
>> s = "hello, world"
=> "hello, world"
>> s.delete!("lo")
=> "he, wrd"
>> s
=> "he, wrd"

まとめ

  • ArrayやHashとStringのdeleteメソッドは元のオブジェクトに影響を与えるかどうかという点で微妙に動きが異なる
  • String#deleteは削除後の文字列を返すが、Array#deleteやHash#deleteは、削除したオブジェクトを返す