Skip to content

Lua next pairs

Jacky edited this page Apr 20, 2023 · 1 revision

Using next()/pairs() to iterate through fields is deprecated, as the semantics has been updated to list all children fields since 2.0-beta8. This means that fields like enchantments.size will now appear when using next()/pairs(). To avoid breaking your code, you should migrate to field.children() or enchantments.entries() depending on your use case.

Replacement

Enchantments

Use enchantments.entries(), which will return an iterator that yields enchantmentID (string) and level (number)

Example (iteration)

Instead of

for ench, lvl in pairs(trade.result_item.enchantments) do
  -- ...
end

Do:

for ench, lvl in trade.result_item.enchantments.entries() do
  -- ...
end

Example (get first enchantment)

Instead of

ench = next(trade.result_item.enchantments)
lvl = trade.result_item.enchantments[ench]

Do:

ench, lvl = trade.result_item.enchantments.entries()()

Container fields

Use field.children(), which will return an iterator that yields fieldName (string)

Example (iteration)

Instead of

for k, v in pairs(trade.villager.inventory) do
  -- use k and v (field?)
end

Do:

for k in trade.villager.inventory.children() do
  -- ...
  local v = trade.villager.inventory[k]
end

Semantics

local iterable = field.children
local iterator = iterable()
-- Lua generic for
-- See PIL 7.2
while true do
  local _v1, _v2, ... = iterator()
  if _v1 == nil do break end
  -- user code
end

Clone this wiki locally