1

私は非常に根本的な何かが欠けているように感じるので、これ以上髪を引き裂かないようにするために、ここに来て、「hand = newgame.view p1」で p1、p1t、および p1t2 が変更されている理由を尋ねます。なぜ p1 が変更されているのかさえわからないので、ここで完全に困惑しています。どんな助けでも大歓迎です。

# encoding: utf-8

class Cards

def view hand
    x = 0
    hand.each do |card|
        if card[0] == 's'
            card[0] = '♠'
        elsif card[0] == 'd'
            card[0] = '♦'
        elsif card[0] == 'h'
            card[0] = '♥'
        elsif card[0] == 'c'
            card[0] = '♣'
        else
            #nil
        end
        hand[x] = card
        x = x + 1
    end
    prettyhand = ''
    hand.each do |card|
        prettyhand = prettyhand + card[0] + card[1] + ' '
    end
    return prettyhand
end#view

end#Cards
###########

deck = 0
up = 0
p1 = 0
p2 = 0
newgame = Cards.new
p1 = [["c", "4"], ["s", "4"], ["d", "q"], ["c", "8"], ["s", "5"], ["s", "q"], ["h", "3"], ["c", "10"]]
    p1t = []
    p1t2 = []
    hand = ''
    p1.each do |card|
        p1t.push card
    end
    p1t.each do |card|
        p1t2.push card
    end
    p '----------------------------------'
    p 'fresh p1:'
    p p1
    p p1t
    p p1t2
    hand = newgame.view p1
    p 'unfresh p1:'#why is this changing??
    p p1
    p p1t
    p p1t2
    p '----------------------------------'

出力:

"----------------------------------"
"fresh p1:"
[["c", "4"], ["s", "4"], ["d", "q"], ["c", "8"], ["s", "5"], ["s", "q"], ["h", "3"], ["c", "10"]]
[["c", "4"], ["s", "4"], ["d", "q"], ["c", "8"], ["s", "5"], ["s", "q"], ["h", "3"], ["c", "10"]]
[["c", "4"], ["s", "4"], ["d", "q"], ["c", "8"], ["s", "5"], ["s", "q"], ["h", "3"], ["c", "10"]]
"unfresh p1:"
[["♣", "4"], ["♠", "4"], ["♦", "q"], ["♣", "8"], ["♠", "5"], ["♠", "q"], ["♥", "3"], ["♣", "10"]]
[["♣", "4"], ["♠", "4"], ["♦", "q"], ["♣", "8"], ["♠", "5"], ["♠", "q"], ["♥", "3"], ["♣", "10"]]
[["♣", "4"], ["♠", "4"], ["♦", "q"], ["♣", "8"], ["♠", "5"], ["♠", "q"], ["♥", "3"], ["♣", "10"]]
"----------------------------------"
4

3 に答える 3

1

FWIW、あなたのview方法はかなり単純化できます:

class Cards
  Suits = { 'c' => '♣', 'd' => '♦', 'h' => '♥', 's' => '♠' }

 def view(hand)
    hand.map do |suit, rank| [ Suits[suit], rank ] end
 end
end

このバージョンでは何も変更されていないため、この問題は回避されます。

于 2012-04-19T01:58:10.447 に答える
1

viewパラメーターを取るメソッドを定義しましたhand(ところで、かっこは便利ですが、メソッドの署名であっても、コードで常にそれらを省略する理由がわかりません)。メソッドはそのview引数を変更しますhand。あなたはそれを次のように呼びます

hand = newgame.view p1

これp1はメソッドによって変更され、viewそれが変更される理由です。

また、なぜあなたが...に設定してから配列の配列に設定したのか興味がp1あり0ます。そうする理由はありません。また、自分だけでなく他の人にもわかりやすい変数名を使用するようにしてください。

于 2012-04-19T01:35:32.630 に答える
1

配列は参照によって渡され、コピーされません。このスニペットをチェックしてください。

a1 = [[1], [2], [3]]
a2 = []

a2 << a1.first # push a reference to the array
a2 # => [[1]]


a1[0][0] += 1 # => 2
a1 # => [[2], [2], [3]] # a1 has changed
a2 # => [[2]] # a2 changed too!

# now push a copy of the array
a2 = [a1.first.dup] # => [[2]]

a1[0][0] += 1 # => 3
a1 # => [[3], [2], [3]] # a1 has changed
a2 # => [[2]] # a2 has not
于 2012-04-19T01:35:41.240 に答える