2
0

More than 1 year has passed since last update.

Ruby と crystal における clone メソッドの違い

Last updated at Posted at 2022-09-23

はじめに

AtCoder さん、ありがとうございます。

結論

clone
Ruby 浅い (shallow) コピー
crystal 深い (deep) コピー

E - SNS のログ

Ruby clone(WA)

n, m = gets.split.map(&:to_i)
a = Array.new(n + 1){ Array.new(n + 1, "N") }
m.times do
  s = gets.split.map(&:to_i)
  case s[0]
  when 1
    a[s[1]][s[2]] = "Y"
  when 2
    (1..n).each do |i|
      a[s[1]][i] = "Y" if a[i][s[1]] == "Y"
    end
  when 3
    b = a.clone
    (1..n).each do |i|
      if b[s[1]][i] == "Y"
        (1..n).each do |j|
          a[s[1]][j] = "Y" if b[i][j] == "Y" && j != s[1]
        end
      end
    end
  end
end
(1..n).each do |i|
  puts a[i][1..].join("")
end
WA
NYYYYY # NYYNYY
NNYNNN
NNNYNN
NNNNNN
NNNNNY
YNNNYN

下記のリファレンスマニュアルにある通り、clone浅い(shallow)コピーであるため、配列の変更結果が反映されてしまします。

Ruby Marshal(AC)

n, m = gets.split.map(&:to_i)
a = Array.new(n + 1){ Array.new(n + 1, "N") }
m.times do
  s = gets.split.map(&:to_i)
  case s[0]
  when 1
    a[s[1]][s[2]] = "Y"
  when 2
    (1..n).each do |i|
      a[s[1]][i] = "Y" if a[i][s[1]] == "Y"
    end
  when 3
-    b = a.clone
+    b = Marshal.load(Marshal.dump(a))
    (1..n).each do |i|
      if b[s[1]][i] == "Y"
        (1..n).each do |j|
          a[s[1]][j] = "Y" if b[i][j] == "Y" && j != s[1]
        end
      end
    end
  end
end
(1..n).each do |i|
  puts a[i][1..].join("")
end

Rubyで深い (deep) コピーといえばMarshal、頻繁に使用されます。

    b = Marshal.load(Marshal.dump(a))

crystal clone (AC)

n, m = read_line.split.map(&.to_i)
a = Array.new(n + 1){ Array.new(n + 1, "N") }
m.times do
  s = read_line.split.map(&.to_i)
  case s[0]
  when 1
    a[s[1]][s[2]] = "Y"
  when 2
    (1..n).each do |i|
      a[s[1]][i] = "Y" if a[i][s[1]] == "Y"
    end
  when 3
    b = a.clone
    (1..n).each do |i|
      if b[s[1]][i] == "Y"
        (1..n).each do |j|
          a[s[1]][j] = "Y" if b[i][j] == "Y" && j != s[1]
        end
      end
    end
  end
end
(1..n).each do |i|
  puts a[i][1..].join("")
end

crystalではclone深い (deep) コピーなんですね。

まとめ

  • crystalに詳しくなった
  • 久々に更新しました

2
0
2

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
2
0