Ruby 首先计算 RHS 上的每个表达式,然后将它们分配给相应的 LHS 变量。
下面是(基本上)Ruby 如何评估第三行a, b = b, a-q*b
:
temp1 = b
temp2 = a-q*b
a = temp1
b = temp2
a = 5
带有,b = 7
和的示例q = 10
:
a, b = (7), (5 - 10*7)
产量
a == 7
b == -65
如您所见,在评估使用它的 RHS 表达式之前,没有值a
或b
从其初始值更改。
与您的 C# 代码中发生的情况对比:
a = b // a is changed BEFORE evaluating the value
// that will be put into b
b = a-q*b // The value of a has already been changed:
// this is now the same as b = b-q*b, which is not intended
使用与上述相同值的示例结果:
a == 7
b == 7 - 10*7 == -63 // Not what we want...
要获得正确的结果,请在此答案的顶部使用带有临时变量的多行赋值:
temp1 = b // 7
temp2 = a-q*b // 5 - 10*7 == -65
a = temp1 // 7
b = temp2 // -65