[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: Francisco Olarte <folarte@...>
- Date: Mon, 12 Oct 2020 09:56:54 +0200
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.