Ruby_Array_11

この記事は、以下のドキュメントを改変(自分なりに整理)して利用しています。

class Array (Ruby 3.0.0 リファレンスマニュアル)

インスタンスメソッド

clear -> self
  • 配列の要素をすべて削除して空にする
    • 破壊的
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> arr.clear
=> []

irb(main):003:0> arr
=> []
irb(main):001:0> arr = [1, 2, 3]
=> [1, 2, 3]

irb(main):002:0> brr = arr
=> [1, 2, 3]

irb(main):003:0> arr.clear
=> []

irb(main):004:0> brr
=> []

clone -> Array

dup -> Array

  • レシーバと同じ内容を持つ新しい配列を返す
    • 浅い(shallow)コピー
  • cloneはfrozen tainted singleton-classの情報も含めてコピー、dupは内容だけをコピー
irb(main):001:0> arr = ['a', 'b']
=> ["a", "b"]

irb(main):002:0> arr_clone = arr.clone
=> ["a", "b"]

irb(main):003:0> arr[1].capitalize!
=> "B"

irb(main):004:0> arr
=> ["a", "B"]

irb(main):005:0> arr_clone
=> ["a", "B"]
irb(main):001:1> arr = ['a', 'b']
=> ["a", "b"]

irb(main):002:0> arr_dup = arr.dup
=> ["a", "b"]

irb(main):003:0> arr[1].capitalize!
=> "B"

irb(main):004:0> arr
=> ["a", "B"]

irb(main):005:0> arr_dup
=> ["a", "B"]
irb(main):001:1> arr = [1, 2]
=> [1, 2]

irb(main):002:0> arr.freeze
=> [1, 2]

irb(main):003:0> arr_clone = arr.clone
=> [1, 2]

irb(main):004:0> arr_dup = arr.dup
=> [1, 2]

irb(main):005:0> arr_clone.frozen?
=> true

irb(main):006:0> arr_dup.frozen?
=> false
require 'benchmark'

Benchmark.bm(7) do |x|
  arr = [1, 2]
  brr = [3, 4]
  x.report('clone:') { 100.times do; arr.clone; end }
  x.report('dup:') { 100.times do; brr.dup; end }
  # 順番を逆にした
  # x.report('dup:') { 100.times do; brr.dup; end }
  # x.report('clone:') { 100.times do; arr.clone; end }
end

# memo
# cloneのほうがdupよりも実行時間が長くなるのかなと思っていた(frozen tainted singleton-class情報のコピー分の差)が、
# 何回か実行するとdupのほうが長くなることもあった
# 実行時間の違いはあるのだろうか?

メモ

  • cloneとdupの差を理解している人は少なそう
    • 実行時間の差に関する情報が欲しい