我发现了这个bubblesort代码here,并想知道它为什么会起作用。
function bubbleSort(A)
local itemCount=#A
local hasChanged
repeat
hasChanged = false
itemCount=itemCount - 1
for i = 1, itemCount do
if A[i] > A[i + 1] then
A[i], A[i + 1] = A[i + 1], A[i]
hasChanged = true
end
end
until hasChanged == false
end
我假设如下:
A[i], A[i + 1] = A[i + 1], A[i]
与:
相同A[i] = A[i + 1]
A[i + 1] = A[i]
这会导致
A[i] = A[i + 1]
例如
A = { [1] = 3, [2] = 1 }
将以
结尾A = { [1] = 1 , [2] = 1 }
为什么不呢?
答案 0 :(得分:3)
显然,正如你自己指出的那样,你的假设是错误的:
Lua允许实际交换变量而无需中间临时分配,就像您发现的气泡一样。
因此
A[i], A[i + 1] = A[i + 1], A[i]
实际上有效。
编辑:很难给你一个你自己没有给自己答案的答案......答案 1 :(得分:3)
如你所知,你认为错了。您可能知道,在lua中,允许表达式返回多个值。反过来,您也可以将表达式的结果分配给多个变量。在您的代码段中:
A[i], A[i + 1] = A[i + 1], A[i]
A[i+1], A[i]
的结果在任何值实际更改之前评估,这意味着当分配发生时,A[i+1], A[i]
中的值被分配给A[i], A[i+1]
就像预期一样。
简而言之:首先,评估右侧的表达式,然后才发生赋值本身。