0

全て、

一部の 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 は割り当てをどのように評価していますか? 複数の割り当てを単一の割り当てに分割すると、結果が異なるのはなぜですか?

4

4 に答える 4

2

Ruby は最初に RHS の各式を評価し、次にそれらをそれぞれの LHS 変数に割り当てます。

(基本的に) Ruby が 3 行目を評価する方法は次の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

ご覧のとおり、値を使用する RHS 式が評価される前に、abは初期値から変更されていません。

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
于 2013-10-01T15:15:42.100 に答える
1

Ruby は、変数を再割り当てする前に、割り当ての右側を評価します。これをより明確にするために、次のようなことをしています。

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)

したがって、結果は異なります。

于 2013-10-01T15:14:11.957 に答える
0

問題は、割り当てで

x, x1 = x1, x-q*x1

Ruby は、いずれかの割り当てを実行する前に、右側の両方の式を評価します。しかし、あなたが書くなら

x = x1
x1 = x-q*x1

次に、最初のステートメントが の値を変更するためx、式の値x-q*x1も変更されます。

このように、一時変数を使用する必要があります

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

式の評価が早すぎることによる影響を避けるためです。

于 2013-10-01T15:16:13.637 に答える
0

x, x1 = x1, x-q*x1は、 x と x1 の両方が基本的に同時に割り当てられることを意味しますが、C# バリアントはそれを考慮していません。あなたのC#コードでは、xはx1の前に割り当てられるため、この時点でxがすでにx1に割り当てられているため、x1-q*x1代わりにx1が割り当てられます。x-q*x1

考えられる一般的な C# ソリューションは次のとおりです。

tempX = x1
tempX1 = x-q*x1
x = tempX
x1 = tempX1
于 2013-10-01T15:14:02.733 に答える