lua-users home
lua-l archive

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


>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.
a[1] is nil, too.
And both "a[1]==b[1]" and "a[2]==b[2]" return "true".

On Mon, Oct 12, 2020 at 3:57 PM Francisco Olarte <folarte@peoplecall.com> wrote:
>
> 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.