背景 (Background)
Array#delete
やArray#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