2013-10-01 160 views
0

所有,红宝石整数分配 - 适应红宝石分配到C型语言

我试图去适应一些Ruby代码在C#中工作,但C#不提供相同的可分配的语法像Ruby

这里我试图Ruby代码适应:

x, x1 = x1, x-q*x1 
    y, y1 = y1, y-q*y1 
    a, b = b, a-q*b 

所以,我把它和这样做,但我比上面得到不同的结果:

x = x1 
    x1 = x-q*x1 
    y = y1 
    y1 = y-q*y1 
    a = b 
    b = a-q*b 

Ruby如何评估任务?为什么当我将多个任务分解为单独的任务时,结果是不同的?

+0

您需要使用一些临时变量。 – iamnotmaynard

+0

请详细说明。为什么需要临时变量?谢谢 – Slinky

+0

你能举一个有效的例子吗?要查看不同的结果? C#中的变量是什么类型? – EkoostikMartin

回答

2

Ruby首先评估RHS上的每个表达式,然后将它们分配给重要的LHS变量。

这里的(基本上)红宝石如何评估第三行a, b = b, a-q*b

temp1 = b 
temp2 = a-q*b 
a = temp1 
b = temp2 

a = 5b = 7一个例子,q = 10

a, b = (7), (5 - 10*7) 

产生

a == 7 
b == -65 

正如你可以看到,不值ab在使用它的RHS表达式被评估之前从其初始值改变。

对比度与正在发生的事情在你的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 
0

x, x1 = x1, x-q*x1意味着x和x1都将基本同时分配,但是您的C#变体不会考虑这一点。在你的C#代码中,x将在x1之前分配,因此x1将被赋值为x1-q*x1而不是x-q*x1,因为此时x已经被赋值为x1。

一种可能的和通用的C#的解决方案是

tempX = x1 
tempX1 = x-q*x1 
x = tempX 
x1 = tempX1 
1

红宝石评估分配的右侧重新分配变量之前。为了使这更加明确,它是做这样的事情:

new_x, new_x1 = old_x1, old_x-q*old_x1 

这导致:

new_x = old_x1 
new_x1 = old_x-q*old_x1 

但你正在做的是这样的:

new_x = old_x1 
new_x1 = new_x-q*old_x1 (= old_x1 - q * old_x1 = (1 - q) * old_x1) 

因此,结果是不同。

0

问题是,在转让

x, x1 = x1, x-q*x1 

红宝石执行任一指配的以前的计算结果在右手侧两者表达式。但是,如果你写

x = x1 
x1 = x-q*x1 

则因为第一个语句修改的x价值,表达x-q*x1的价值也发生了变化。

你需要使用一个临时变量,这样

newx = x1 
x1 = x-q*x1 
x = newx 

避免太早评估表达的影响。