  lua-l archive

• Subject: Why does the output of "for in pairs" is right whereas the output of "for in ipairs" is wrong?
• From: 孙世龙 sunshilong <sunshilong369@...>
• Date: Thu, 15 Oct 2020 17:10:27 +0800

```Hi, list

Here are the related code snippets(which are contained in a file named
as test.lua):
local mt = {}
local Set = {}

function Set.new (l) -- 2nd version
local set = {}
setmetatable(set, mt)
for _, v in ipairs(l) do set[v] = true end
return set
end

function Set.union (a, b)
local res = Set.new{}
print(#res)
for k in pairs(a) do res[k] = true end
for k in pairs(b) do res[k] = true end
return res
end

-- presents a set as a string
function Set.tostring (set)
local l = {} -- list to put all elements from the set
for e in pairs(set) do
l[#l + 1] = tostring(e)
end
return "{" .. table.concat(l, ", ") .. "}"
end

s1 = Set.new{10, 20, 30, 50}
s2 = Set.new{30, 1}
print(s1,s1,s1,s1)
print(s1,s1,s1)
print(#s1)

print("\noutput is ok below")
--output is ok
for k, v in pairs(s1) do
print(k, v)
end

for k, v in pairs(s2) do
print(k, v)
end

print("\noutput is strange below, why?")
--output is strange, why
for k, v in ipairs(s1) do
print(k, v)         --output nothing
end

print("---------------")
for k, v in ipairs(s2) do
print(k, v)          --only outputs the last elment
end

Here is the outputs while run the script(i.e. lua test.lua) on Lua-5.3.5 :

true    true    true    true
nil     nil     nil
0

output is ok below
20      true
50      true
10      true
30      true
1       true
30      true

output is strange below, why?
---------------
1       true

Why does the output of "for in pairs" is right whereas the output of
"for in ipairs" is wrong?

I have thought and thought about it, but I am still confused now.
I would be grateful to have some help with help with this question.

Best regards
Sunshilong

```

• Follow-Ups: