使用常规变量赋值和质量变量赋值时的结果不同

时间:2015-08-29 02:25:57

标签: ruby

将使用质量变量赋值的函数转换为使用常规变量赋值的函数

# mass assignment
def fibo_finder n
    a, b = 0, 1
    n.times { a, b = b, a + b }
    a
end

# regular assignment
def fibo_finder2 n
    a = 0
    b = 1
    n.times do
        a = b
        b = a + b
    end

    return a
end

puts "Must be: 3. fibo_finder: #{fibo_finder(4)} fibo_finder2: #{fibo_finder2(4)}"
puts "Must be: 13. fibo_finder: #{fibo_finder(7)} fibo_finder2: #{fibo_finder2(7)}"
puts "Must be: 55. fibo_finder: #{fibo_finder(10)} fibo_finder2: #{fibo_finder2(10)}"

运行代码结果:

  

必须是:3。fibo_finder:3 fibo_finder2:8

     

必须:13。fibo_finder:13 fibo_finder2:64

     

必须:55。fibo_finder:55 fibo_finder2:512

乍一看,除了如何分配变量外,这两个函数看起来是等价的。但结果显示不然。

当使用质量赋值分配变量时,Ruby是否会做一些特殊的事情?

我使用repl来运行代码

3 个答案:

答案 0 :(得分:1)

在你的质量分配示例中:

a, b = b, a + b

并行执行任务 - 评估右手表达式,然后将两个结果分配到左侧。

在你的第二个例子中:

a = b
b = a + b

a设置为b然后 b设置为a + b(或b + b,因为{{1}现在等于a

答案 1 :(得分:0)

假设:

a = 1
b = 2

然后使用并行分配

a,b = b,a #=> [2, 1] 
a         #=> 2 
b         #=> 1 

相比之下:

a = 1
b = 2

a = b     #=> 2 
b = a     #=> 2 
a         #=> 2
b         #=> 2

并行赋值通常用于交换变量值,以避免创建临时变量。如果它像我的第二个例子那样工作,那么你就无法使用它。

答案 2 :(得分:0)

这两项作业并不相同。

在并行分配中:

a, b = b, a + b

评估右侧,收集一个数组,然后左侧从该数组中获取值。它相当于:

arr = [b, a + b]
a, b = arr

请注意,在b中获取a + b的值为a的原始值。