LoginSignup
5
5

More than 5 years have passed since last update.

Arrayから条件に一致する最初の要素を削除するメソッド`Array#delete_first`を作ってみた

Posted at

背景 (Background)

Array#deleteArray#delete_ifでは、条件に一致した 全ての 要素が削除されてしまいます。初めて見つかった要素一つだけを削除したいときに適当なメソッドが無かったので定義してみました。

利用例 (Usage)

array = [:a, :b, :a, :b]
=> [:a, :b, :a, :b]

# Array#delete_first : search element by Array#index
array.delete_first :a
=> [:b, :a, :b]
array.delete_first :b
=> [:a, :a, :b]

array.delete_first { |elm| elm == :a }
=> [:b, :a, :b]
array.delete_first { |elm| elm == :b }
=> [:a, :a, :b]

# Array#rdelete_first : search element by Array#rindex
array.rdelete_first :a
=> [:a, :b, :b]
array.rdelete_first :b
=> [:a, :b, :a]

array.rdelete_first { |elm| elm == :a }
=> [:a, :b, :b]
array.rdelete_first { |elm| elm == :b }
=> [:a, :b, :a]

破壊的メソッド(Array#delete_first!, Array#rdelete_first!)では、元の配列を直接変更します。要素を削除できた場合は(要素削除済みの)selfを返します。削除できなかった場合はnilを返します。

コード (Code)

class Array
  def delete_first!(val=nil, &block)
    i = block_given? ? self.index(&block) : self.index(val)
    self.delete_at(i) unless i
    i && self
  end

  def delete_first(val=nil, &block)
    clone_self = self.dup
    clone_self.delete_first!(val, &block)
    clone_self
  end

  def rdelete_first!(val=nil, &block)
    i = block_given? ? self.rindex(&block) : self.rindex(val)
    self.delete_at(i) unless i
    i && self
  end

  def rdelete_first(val=nil, &block)
    clone_self = self.dup
    clone_self.rdelete_first!(val, &block)
    clone_self
  end
end

参考 (Reference)

環境情報 (Environments)

OS, Kernel

% inxi -SM
System:    Host: HOSTNAME Kernel: 2.6.32-504.el6.x86_64 x86_64 (64 bit) Console: tty 5
           Distro: CentOS release 6.6 (Final)
Machine:   System: VMware product: VMware Virtual Platform
           Mobo: Intel model: 440BX Desktop Reference Platform
           Bios: Phoenix v: 6.00 date: 04/14/2014

Ruby, Pry

% ruby --version
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]

% pry --version
Pry version 0.10.1 on Ruby 2.1.2
5
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5