是否同时完成多个变量分配?

Kal*_*ham 5 ruby variables

我试图理解Euclid算法以找到最大公约数,并且在使用此代码(特别是多变量赋值)时遇到困难。

def greatest_common_factor(u, v)
  u, v = u.abs, v.abs
  puts(u % v)
    while v > 0
  u, v = v, u % v
    end
  u
end
Run Code Online (Sandbox Code Playgroud)

我假设先分配“ u”,然后分配v,但是更明确地编写它会破坏算法。

u = v
v = u % v
Run Code Online (Sandbox Code Playgroud)

Sha*_*tMo 1

当你写下这个:

    u = v
    v = u % v
Run Code Online (Sandbox Code Playgroud)

我认为这只是这样的事情:

    u = v
    v = v % v # u == v, this will make v to be 0, so break it down
Run Code Online (Sandbox Code Playgroud)

我将尝试回答多变量赋值问题。这是我的测试代码:

    a = 1
    b = 2
    a, b = 3, a # after this, a == 3, b == 1
Run Code Online (Sandbox Code Playgroud)

你可以看到,就像a, b = [3, a],你会[3, a]先评估部分。分析来了Ripper

    [:program,
     [[:massign,
       [[:@ident, "a", [1, 0]], [:@ident, "b", [1, 2]]],
       [:mrhs_new_from_args,
        [[:@int, "3", [1, 4]]],
        [:var_ref, [:@ident, "a", [1, 6]]]]]]]
Run Code Online (Sandbox Code Playgroud)

正如我上面所说,您会看到:mrhs_new_from_args将首先对其进行评估。