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の差を理解している人は少なそう
- 実行時間の差に関する情報が欲しい