lua 学习笔记

正所谓技多不压身(?),在这里打算记录学一门叫做lua的语言的一些困惑

lua学习笔记

table

~lua的table有点python dict的意思,但是又不完全是一个hash映射,更像是一个对象。~
上述说法经大佬提示修改:
lua的table就是一个hash映射。后面给出具体解释
这里我们给出例子:

1
2
3
> b = {'aaaa',1}
> print(b[1])
aaaa

这个就是最简单的lua的table的格式,lua允许将任何类型的数据放在table之中(甚至是lua里面的nil类型),在获取数据的时候,有好几种类型:

  • 当数据没有指定任何状态下(如例子),可以使用index的方式,但是注意是从1开始的

    1
    2
    3
    > b = {['aaa']=1}
    > print(b['aaa'])
    1
  • 当数据使用类似于下标的方式指定了对应的映射关系的话,就可以通过下标的方式来访问

    1
    2
    3
    > t = {{a=1,b=2},{c=3,d=4}}
    > print(t[1].a)
    1
  • 当我们指定了tuple内容之后,我们可以通过.的方式进行作用域访问。

    1
    2
    3
    4
    5
    6
    > function test()
    >> return "test"
    >> end
    > t = {test}
    > print(t[1]())
    test
  • 当赋值内容为函数的时候,可将其直接使用。
    处理器关于table方面的逻辑

    首先我们可以看到,有一个叫做arrayindex的函数,通过这个函数,我们能够判断当前的table是不是数组型的(也就是是不是指定了下标)。如果key作为数组的一部分的话,那么久视为数组处理。否则的话,将key传入mainposition函数,进行hash映射,从而找到对应的节点:

2017 3.5

function 与: 和 .

lua也是讲究面向对象的变成方式。这里以函数为例讲解一下。

1
2
3
4
5
6
> Class = {}
> Class.x = 1
> Class.y = 2
> function Class:printmy()
>> print(self.x,self.y)
>> end

我们首先定义了一个table叫做class,其中有属性x,y分别为1,2。然后这里我们使用了:作为函数定义给了Class,并且让其输出[本Class的x,y]。然后如果我们按照昨天教的方法调用函数的话:

1
2
3
4
5
6
> Class.printmy()
stdin:2: attempt to index local 'self' (a nil value)
stack traceback:
stdin:2: in function 'printmy'
stdin:1: in main chunk
[C]: ?

此时会报错,printmy函数会尝试去寻找self对应的变量,显然我们没有去定义,自然不存在的,所以就无法找到对应的变量。然而我们使用:去访问的时候会变成:

1
2
> Class:printmy()
1 2

由于:的符号,会将self(或者this)理解成当前对象,然后就会到当前对象中查找x和y属性,所以就能够顺利的找到这个属性并且输出。