我觉得我错过了非常非常基本的东西,所以,为了避免撕掉更多的头发,我来这里问为什么p1,p1t和p1t2被修改为“hand = newgame.view p1”。我甚至不知道为什么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"]]
"----------------------------------"
答案 0 :(得分:1)
你已经定义了一个方法view
,它接受一个参数hand
(顺便说一句,parens很好,不知道为什么你总是在代码中省略它们,即使在方法签名中也是如此)。 view
方法修改其参数hand
。你把它称为
hand = newgame.view p1
此p1
由方法view
修改,这就是它发生变化的原因。
我也很好奇为什么要将p1
设置为0
...然后将其设置为数组数组。没有理由这样做。此外,尝试为自己和他人使用描述性变量名称。
答案 1 :(得分: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
答案 2 :(得分:1)
FWIW,您的view
方法可以简化很多:
class Cards
Suits = { 'c' => '♣', 'd' => '♦', 'h' => '♥', 's' => '♠' }
def view(hand)
hand.map do |suit, rank| [ Suits[suit], rank ] end
end
end
此版本不会修改任何内容,因此可以避免此问题。