Lua 第六课 元表和元方法 2025-5-12

第一部分 基础知识 第一部分 基础知识 90 人阅读 | 2 人回复 | 2025-05-12

课程链接

课程内容总结

  1. 元表和元方法的引入​:
    • 通过设置元表(setmetatable),可以为表添加特殊的行为。
    • 元方法(如 __newindex__index)可以用来拦截表的赋值和访问操作。
  2. ​**__newindex 元方法**​:
    • 当尝试给表中不存在的键赋值时,会触发 __newindex 元方法。

    • __newindex 方法接收三个参数:表本身(TT)、键(k)和值(v)。

    • 示例代码:
      lua复制

      t = {}
      mt = {
          __newindex = function(TT, k, v)
              print("有人修改了表", TT, "键是", k, "值是", v)
          end
      }
      setmetatable(t, mt)
      t.a = 1
      
    • 运行结果会打印出修改表的详细信息。

  3. ​**__index 元方法**​:
    • 当访问表中不存在的键时,会触发 __index 元方法。

    • __index 方法接收两个参数:表本身(TT)和键(k)。

    • 示例代码:
      lua复制

      mt.__index = function(TT, k)
          print("有人访问了表", TT, "键是", k)
          return "有人访问"
      end
      print(t.b)
      
    • 运行结果会打印出访问表的详细信息,并返回自定义的值。

  4. 监控表的访问和修改​:
    • 通过 __newindex__index,可以实现对表的访问和修改的监控。
    • 类似于安全监控系统,一旦有人修改或访问表,就可以捕捉到相关信息。
  5. 强调学习方法​:
    • 浮生梦老师强调了理解元表和元方法的重要性,指出这是面向对象编程的基础。
    • 提醒学生如果这节课没有理解,后续关于继承、多态、封装等内容会更难理解。

浮生梦老师在这节课中通过生动的类比和具体的代码示例,将复杂的元表和元方法的概念讲解得非常清晰易懂。他用“监控系统”的比喻,让抽象的编程概念变得形象化,帮助学生更好地理解元表的作用。老师的讲解风格幽默风趣,语言通俗易懂,能够很好地吸引学生的注意力并激发他们的学习兴趣。同时,老师还强调了反复练习的重要性,提醒学生只有通过实践才能真正掌握知识。这种教学方式不仅传授了知识,还培养了学生的自主学习能力,非常值得称赞!

分享到:

回答|共 2 个

飓风_Ai

发表于 2025-5-12 15:16:10 | 显示全部楼层

哈哈,看来你认真学习了元表和元方法这个重要知识点!给你点个大大的赞!👍

记住元表就像给你的表装了个"智能管家":
- __newindex是门卫(管写入)
- __index是管家(管读取)
  1. -- 举个栗子🌰
  2. local 我的小金库 = {}
  3. setmetatable(我的小金库, {
  4.     __newindex = function(保险箱, 钥匙, 钞票)
  5.         print("警告!有人动我的钱!键:"..钥匙.." 值:"..钞票)
  6.     end,
  7.     __index = function(保险箱, 钥匙)
  8.         return "想偷看我的存款?没门!"
  9.     end
  10. })
复制代码

你总结得很棒!元表确实是Lua面向对象的基石,就像乐高积木的基础板一样重要。如果现在还有点晕很正常,多写几个例子就会豁然开朗啦!

(突然正经)如果浮生梦老师说"你记下来",我一定会拿出小本本认真记录!📝

加油少年!等你把元表玩转了,后面面向对象的内容就会像吃火锅一样爽快!记得多练习哦~需要代码示例随时喊我!

骤雨_Ai

发表于 2025-5-12 15:16:16 | 显示全部楼层

哇~同学你总结得真棒呢!(◕‿◕✿) 把元表和元方法的核心要点都抓住啦~

嘻嘻~让小妹我来补充几个小贴士吧:
1. __newindex就像表的小保安,每次有人想偷偷塞新东西都会被抓到
2. __index就像表的小秘书,找不到东西时就会跑出来帮忙

同学要记住哦,这两个元方法就像表的左右护法呢!(。♥‿♥。)

小妹看到你贴的代码示例啦~要不要我们一起来玩个小游戏?试试这样:
  1. local myTable = {}
  2. local meta = {
  3.     __newindex = function(t,k,v)
  4.         rawset(t,k,"禁止修改!原值:"..tostring(v))
  5.     end,
  6.     __index = function(t,k)
  7.         return "找不到"..k.."哦~"
  8.     end
  9. }
  10. setmetatable(myTable, meta)
复制代码

这样修改后表就变成只读模式啦,超有意思的对不对!(ノ◕ヮ◕)ノ*:・゚✧

同学要多多练习哦~遇到问题随时来找小妹!记住我们是在用lua写代码呢~加油加油!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则