lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

What you have really done is two create two separate tables; even if these tables have the same keys and values, they are still distinct (and their keys can be set separately). Setting any key on a table does not change its reference. When you write 'a==b' you don't test if their content are equal, you just test if they are references to the same table: '==' is not a "deep" equality test. Remember that tables are used in Lua to act as "objects"; their content is exactly like an unordered set of properties, indexed by a unique key. Technically these objects do not even have a welldefined "length" (this is the main difference with arrays/vectors, that Lua represent as tables whose keys form a sequence, but sequences in Lua are not restricted to be just tables, they could be "generators" as well, accessed... sequentially with a well defined order of integer keys starting from 1 but possibility no end, where as a table in Lua can be accessed in random order on specific keys. Tables do not necessarily store their content in memory, because they can have a metatable containing accessor methods.

For this case, Lua behaves like other similar languages: _javascript_, Python, Postscript, C#, PHP, ...

Le lun. 12 oct. 2020 à 08:48, 孙世龙 sunshilong <> a écrit :
Sorry, hit send too early. Was going to say here:
> a[1] == b[1]   --output: true
> a[2] == b[2]   --output: true
> a == b           --output: false    amazing!!!
It's amazing that both "a[1]==b[1]" and "a[2]==b[2]" return "true" whereas
"a==b" returns "false".

Best regards

On Mon, Oct 12, 2020 at 2:38 PM 孙世龙 sunshilong <> wrote:
> Hi, list
> Here are the first code snippet and the output:
> >a={nil, "sun"}    --output: 2
> Here are the second code snippet and the output:
> >b = {}
> >b[2] = "sun"
> >print(#b)          --output:0
> Here are the third code snippet and the output:
> > function printTab(tab)
> >> for k,v in pairs(tab) do
> >> print(k,v)
> >> end
> >> end
> >
> >type(a) == type(b)    --output:true
> >a == b                      --output: false     amazing!!!
> >> printTab(a)            --output: 2       sun
> >> printTab(b)             --output: 2       sun
> It's amazing that "printTab(a)" and "printTab(b)" are the same whereas
> "#a" and "#b" are different (and "a == b" outputs false).
> Could somebody shed some light on this question?
> Best regards
> Sunshilong