[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Why does #{nil, "sun"} output 2, whereas a={}; a[2]="sun"; print(#a) output 0?
- From: 孙世龙 sunshilong <sunshilong369@...>
- Date: Mon, 12 Oct 2020 19:22:53 +0800
>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.