Ruby 红宝石方块赢了';不改变局部变量

Ruby 红宝石方块赢了';不改变局部变量,ruby,scope,block,Ruby,Scope,Block,此代码如下: def create_sym_matrix ran_arr = Array.new(5){rand(1..100)} ran_arr[1] = 0 mat_arr = Array.new(5){|i|ran_arr.push(ran_arr.shift)} Matrix.columns(mat_arr) end aa = create_sym_matrix => Matrix[[86, 86, 86, 86, 86], [0, 0, 0, 0, 0], [

此代码如下:

def create_sym_matrix
  ran_arr = Array.new(5){rand(1..100)}
  ran_arr[1] = 0
  mat_arr = Array.new(5){|i|ran_arr.push(ran_arr.shift)}
  Matrix.columns(mat_arr)
end

aa = create_sym_matrix

=> Matrix[[86, 86, 86, 86, 86], [0, 0, 0, 0, 0], [20, 20, 20, 20, 20], 
[39, 39, 39, 39, 39], [48, 48, 48, 48, 48]]
有人能给我解释一下为什么它不旋转吗?我试图得到一个对角线上有零的对称矩阵。

的文档解释了:

新建(大小=0,默认值=零)
新(阵列)
新(大小){|索引|块}

在最后一种形式中,将创建给定大小的数组。该数组中的每个元素都是通过将元素的索引传递给给定的块并存储返回值来创建的

{i|ran|u arr.push(ran|u arr.shift)}
总是返回相同的值:存储在
ran|u arr
中的数组。新数组包含对
ran\u arr
的5个引用。
mat_arr
的行包含相同的值,因为没有五个不同的行;同一个物体连了五次

要解决此问题,您应该从块中返回一份
ran\u arr

  mat_arr = Array.new(5){|i|ran_arr.push(ran_arr.shift).clone}
您会注意到,它仍然不会生成对角线上有零的矩阵。要实现此目标,您需要纠正算法:

def create_sym_matrix
  ran_arr = Array.new(5){rand(1..100)}
  ran_arr[4] = 0
  mat_arr = Array.new(5){|i|ran_arr.unshift(ran_arr.pop).clone}
  Matrix.columns(mat_arr)
end
输出:

Matrix[[0, 38, 8, 48, 73], [73, 0, 38, 8, 48], [48, 73, 0, 38, 8], [8, 48, 73, 0, 38], [38, 8, 48, 73, 0]]
文件说明:

新建(大小=0,默认值=零)
新(阵列)
新(大小){|索引|块}

在最后一种形式中,将创建给定大小的数组。该数组中的每个元素都是通过将元素的索引传递给给定的块并存储返回值来创建的

{i|ran|u arr.push(ran|u arr.shift)}
总是返回相同的值:存储在
ran|u arr
中的数组。新数组包含对
ran\u arr
的5个引用。
mat_arr
的行包含相同的值,因为没有五个不同的行;同一个物体连了五次

要解决此问题,您应该从块中返回一份
ran\u arr

  mat_arr = Array.new(5){|i|ran_arr.push(ran_arr.shift).clone}
您会注意到,它仍然不会生成对角线上有零的矩阵。要实现此目标,您需要纠正算法:

def create_sym_matrix
  ran_arr = Array.new(5){rand(1..100)}
  ran_arr[4] = 0
  mat_arr = Array.new(5){|i|ran_arr.unshift(ran_arr.pop).clone}
  Matrix.columns(mat_arr)
end
输出:

Matrix[[0, 38, 8, 48, 73], [73, 0, 38, 8, 48], [48, 73, 0, 38, 8], [8, 48, 73, 0, 38], [38, 8, 48, 73, 0]]

非常感谢你!你能解释一下为什么块一次又一次地返回相同的值吗?Ruby对象是通过引用复制的。这意味着
a=ran\u arr
不会复制
ran\u arr
的值,它只会为它创建一个新名称。块每次运行时都会更改
ran\u arr
。经过5次旋转后,
ran\u arr
的值与创建
ran\u arr
时的顺序相同。这真是一团糟,我非常感谢你!你能解释一下为什么块一次又一次地返回相同的值吗?Ruby对象是通过引用复制的。这意味着
a=ran\u arr
不会复制
ran\u arr
的值,它只会为它创建一个新名称。块每次运行时都会更改
ran\u arr
。经过5次旋转后,
ran\u arr
的值的顺序与创建
ran\u arr
时的顺序相同。我弄得一团糟