将使用质量变量赋值的函数转换为使用常规变量赋值的函数
# 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来运行代码
答案 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
的原始值。