您可以为此使用并行分配,例如a,b = b,a
。附带说明一下,while
循环在 Ruby 中很少使用,将您视为菜鸟。一种更类似于 Ruby 的方式是使用枚举器,如times
、upto
、downto
等,它们可以方便地提供索引i
并j
作为循环变量。当您将方法存储在 Array 类中时,您还可以保存自己以matrix
一遍又一遍地键入,因为您已经在该类中。此外,通常先编写一个 mutator 方法(更改原始对象,通常!
在方法名称的末尾用一个 bang 表示),然后编写一个附加的 non-mutator 方法,该方法只是在副本上调用 mutator。这是我编写代码的方式:
class Array
def my_transpose!
size.times do |i|
0.upto(i) do |j| # iterate only through lower half
self[i][j], self[j][i] = self[j][i], self[i][j] # swap rows and cols
end
end
self # return the array itself
end
def my_transpose
dup.map(&:dup).my_transpose! # inner arrays are dup'ed, too
end
end
有趣的是,Ruby 的内置transpose
函数不能用作 mutator。以下是如何使用上面的代码:
a = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
a.my_transpose! # mutator
#=> [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
a
#=> [[1, 1, 1], [2, 2, 2], [3, 3, 3]] # note that a changed
a.my_transpose!
#=> [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
a
#=> [[1, 2, 3], [1, 2, 3], [1, 2, 3]] # a is back to its original state
a.my_transpose # non-mutator
#=> [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
a
#=> [[1, 2, 3], [1, 2, 3], [1, 2, 3]] # note that a did not change