lua-users home
lua-l archive

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


On Mon, Oct 12, 2020 at 8:39 AM 孙世龙 sunshilong <sunshilong369@gmail.com> 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?

# works as sequence length only when you have "normal", sequence,
i.e., without embedded nil. In fact it is a border  finding opertator,
defined in the manual as
"The length operator applied on a table returns a border in that
table. A border in a table t is any natural number that satisfies the
following condition:
     (border == 0 or t[border] ~= nil) and t[border + 1] == nil
In words, a border is any (natural) index present in the table that is
followed by an absent index (or zero, when index 1 is absent)."

Probably when you use the {} construct lua builds a table with two
elements in the array part, but when you build b it gets 0 elements in
the array part. Lua is allowed by the definition to do the following (
it may be doing other things ).
- For a: two elements in array part. Array length is 2. a[2] is not
nil. a[3] is nil. return 2.
- For b: Empty array part. b[1] is nil. Return 0.

Tables in lua are initially easy, but complex beasts when doing some
list oriented things. This arises from the fact that they are really
dictionaries ( associative arrays ) with some optimizations and
niceties to treat them as lists, and from the fact that nil is special
in lua. It is a legal value for a local variable, but you cannot store
it in a table because assigning nil is used to delete elements (
unlike, i.,e., perl, or Java, or python , where key existence is
separated and you have a method for deleting entries ).

Francisco Olarte.