Lua学习笔记-day7: 元表

[]Lua元表(Metatable)

  1. 定义:

    1. 元表(metatable)允许我们改变表(table)的行为,每个行为关联了对应的元方法。

    2. 处理元表的两个函数:

      1. setmetatable(table, metatable)

        1. 为指定table设置元表metatable;

        2. 如果metatable中存在__metatable键值,setmatatable会失败;

      2. metatable = getmetatable(table)

        1. 返回表table的元表metatable。

  2. __index元方法:

    1. 通过键key访问table时,如果table中存在键,则返回该键对应元素的值;

    2. 否则,访问table的元表metatable中的__index键:

      1. 如果__index键对应的元素是一个表格,则返回表格中键key对应的元素值。

        1. 示例:

          1. table = {key1 = 'value1'}

          2. metatable = {__index = {key2 = 'value2'}}

          3. setmetatable(table, metatable)

          4. print(table.key1, table.key2)

        2. 结果:输出为:value1 value2

      2. 如果__index键对应的元素是一个函数,则返回该函数的返回值。

        1. 示例:

          1. table = {key1 = 'value1'}

          2. metatable = {__index =

            1. function(table, key)

              1. if (key == 'key2') then

                1. return 'value2'

              2. else

                1. return 'other'

              3. end

            2. end

          3. }

          4. setmetatable(table, metatable)

          5. print(table.key1, table.key2, table.key3)

          6. 结果:输出为:value1 value2 other

  3. __newindex元方法:

    1. 对比:__index元方法用来对表进行访问;__newindex元方法用来对表进行更新。

    2. 作用:

      1. 当为表table的键key赋值时,如果table中不存在键key且元表中存在__newindex元方法,则调用__newindex元方法;

      2. 否则,直接对table表的键key执行赋值操作;

    3. 示例1:

      1. table = {key1 = 'value1'}

      2. newindex = {}

      3. metatable = { __newindex = newindex, __index = newindex}

      4. setmetatable(table, metatable)

      5. table.key1 = 'value11' --对table中的key1进行赋值。

      6. table.key2 = 'value22' --对newindex中的key2进行赋值。

      7. print(table.key1, table.key2) --依次读取table中的key1和newindex中的key2

    4. 示例2:

      1. table = {key1 = 'value1'}

      2. metatable = { __newindex =

        1. function(table, key, value)    

          1. rawset(table, key, value) --使用内置的rawset()函数更新表table。

        2. end

      3. }

      4. setmetatable(table, metatable)

      5. table.key1 = 'value11' --对表table中的key1进行赋值。

      6. table.key2 = 'value22' --调用__newindex键对应的函数。

      7. print(table.key1, table.key2) --依次读取表table中的键key1和key2.

  4. 为表添加操作符

    1. __add键:对应运算符'+';包含在元表中,实现两表相加操作。

      1. 示例:

        1. metatable = {__add =

          1. function(table1, table2)

            1. for index = 1, #table2 do

              1. table.insert(table1, #table1 + 1, table2[index])

            2. end

            3. return table1

          2. end

        2. }

        3. table1 = {1,2,3}

        4. table2 = {4,5,6}

        5. setmetatable(table1, metatable)

        6. table = table1 + table2 --此时table = {1,2,3,4,5,6}

    2. __sub键:对应运算符'-';

    3. __mul键:对应运算符'*';

    4. __div键:对应运算符'/';

    5. __mod键:对应运算符'%';

    6. __unm键:对应运算符'-';

    7. __concat键:对应运算符'..';

    8. __eq键:对应运算符'==';

    9. __lt键:对应运算符'<';

    10. __le键:对应运算符'<=';

  5. __call元方法

    1. 作用:当表table被当做函数调用时,会调用元表metatable中的__call元方法。

    2. 示例:

      1. metatable = {__call =

        1. function(table1, table2)

          1. local sum = 0

          2. for index = 1, #table1 do sum = sum + table1[index] end

          3. for index = 1, #table2 do sum = sum + table2[index] end

          4. return sum

        2. end

      2. }

      3. table1 = {1,2,3,4,5}

      4. table2 = {6,7,8,9,10}

      5. setmetatable(table1, metatable)

      6. sum = table1(table2) --sum的值为55

  6. __tostring元方法

    1. 作用:直接使用print()函数打印表时,输出__tostring方法的返回值。

    2. 示例:

      1. metatable = {__tostring =

        1. function(table1)

          1. local str = ''

          2. for index = 1, #table1 do str = str..'-'..table1[index] end

          3. return str

        2. end

      2. }

      3. table1 = {1,2,3,4,5}

      4. setmetatable(table1, metatable)

      5. print(table1) -- 输出:-1-2-3-4-5

 

 

 

你可能感兴趣的:(Lua学习笔记)