57476


Rubyで信号処理をしています．  
その際に，あるクラス内に以下のようなコードの部分があります．

[code]

    txs = @_transmits.dup # or deep_dup: require 'active_support'
    rxs = @_receives.dup  # or deep_dup
    
    dist = makeNonlinearSignal(txs) # クラス内メソッド
    
[/code]

この部分において，メソッド`makeNonlinearSignal`前後で`txs`の中身が変化してしまいます．  
ちなみに`makeNonlinearSignal`メソッドの中身は以下です．

[code]

    # PAの歪み信号とLNAの歪み信号を返す
    def makeNonlinearSignal(signal)
      distPA = channelTimeDomainConvolution(signal.map! {|a| a * a.abs2})
      distLNA = channelTimeDomainConvolution(signal.map! {|a| a + @_paCoef * a * a.abs2}).map {|a| a * a.abs2}
    
      return distPA, distLNA
    end
    
[/code]

Rubyは引数による変数の渡しはでき，受けができないはずなのですが，この原因がわかりません．  
さらに，`dup`（少し浅い）及び`deep_dup`（深い）でコピーしてもどちらもメソッド後に信号が変化してしまいます．

どのようにしたら`txs`は変化しないようにできますでしょうか．  
ご教授お願いいたします．


CC BY-SA 4.0
2019-05-24T08:21:17.037
55219
2019-08-20T05:04:19.160
2019-05-24T08:29:25.100
30173
30173
question
ruby
配列にdupまたはdeep_dupでコピーしてもコピーした対象が変化してしまう現象を解決したい


`!`の破壊的メソッドを使用していたため，`makeNolinearSignal`メソッドの引数`signal`にそのまま`map`されることが原因と判明しました.


CC BY-SA 4.0
2019-08-20T05:04:19.160
57476
2019-08-20T05:04:19.160
30173
55219
answer