0

私はRubyでこのようなステートメントを持っています:

@mastertest = connection.execute("select code_ver from mastertest")

だから今、私はこの2D配列のコピーを作成したいと思います。なぜなら、のような@temp = @mastertestことをすると、に変更を加える@mastertestときに変更が加えられるから@tempです。

私は以下を使ってみました:

@temp = Marshal.load(Marshal.dump(@mastertest))

しかし、これは私に言うエラーを与えます"no marshal_dump is defined for class Mysql2::Result"@mastertestしたがって、は2次元配列以外のタイプであると想定しています。

誰かがこの配列のコピーを作成する方法を教えてもらえますか?

4

3 に答える 3

1

ここで作業するには 2 つの方法があります: (dup または clone は完全なディープ コピーではなく、Marshal のみが行います)。

  1. Object#dup または clone を使用します。試してみてください@temp = @mastertest.dup。Mysql2::Result の形式がわからないので、Enumerable-mixed クラスの各要素を複製する必要がある「2-D 配列」のような場合、この方法は失敗する可能性があります。dupメソッドはそのクラスを呼び出すだけですinitialize_copy。配列のようなオブジェクトに POD (plain-old-data) 以外のものがある場合、そのオブジェクトの浅いコピーのみが作成されます。

  2. Mysql2::Resultの 2 つの方法でモンキー パッチを作成します。これにより、 に応答します。ここでマーシャルに関するドキュメントを参照してください。marshal_dumpmarshal_loadMarshal.dump

于 2012-10-17T09:42:30.683 に答える
0

私は以下を使用してこれを解決することができました:

@new_array = Array.new
@mastertest.each { |r| @new_array.push(r[0]) }
于 2012-10-19T18:16:04.690 に答える
0

試す

@temp = @mastertest.clone

@temp への変更は @mastertest に影響しなくなりました

于 2012-10-17T09:50:49.917 に答える