zoukankan      html  css  js  c++  java
  • lua 模块与环境

    编写一个模块的最简单方法:

    1. -- complex.lua
    2. -- 模块实际上是一个表
    3. complex = {}
    4. -- 定义模块函数
    5. function complex.add(c1,c2) ... end
    6. -- 调用模块内部的函数,需要complex.前缀
    7. function complex.callAdd(c1,c2)
    8. complex.add(c1,c2)
    9. end
    10. -- 之前的声明把所有函数都放入complex表中了,最后返回这个表
    11. return complex

    调用这个模块时:
    1. -- main.lua
    2. local complex = require("complex")
    3. complex.add(x,y)

    上述代码有几点麻烦:
    1.在模块内部,一个函数调用另一个函数时,必须加上complex前缀
    2.最后必须返回complex这个表

    改进的办法:
    1. -- complex.lua
    2. -- 模块实际上是一个表,这里从require的参数(...)获取模块名称
    3. local modName = ...
    4. -- 模块的内部名称M
    5. local M = {}
    6. -- lua的全局变量默认存储地方为_G _G[modName] = M 等价于定义一个名字为modName的全局变量
    7. _G[modName] = M
    8. -- require函数当一个函数无返回值的时候,会返回package.loaded[模块名]的值
    9. -- 于是这样写就可以省去最后的return语句了
    10. package.loaded[modName] = M
    11. -- setfenvlua版本的using namespace M,这样写就可以避免每次都加M.前缀了
    12. -- 为了能够访问其他全局变量,把M的元表的__index字段设为_G,这样不在M表的函数和变量就会到_G表查找
    13. setmetatable(M, {__index = _G})
    14. setfenv(1,M)
    15. -- 定义模块函数,注意,模块名称被省略
    16. function add(c1,c2) ... end
    17. -- 调用模块内部的函数,需要complex.前缀
    18. function callAdd(c1,c2)
    19. add(c1,c2)
    20. end
    21. -- 不用返回这个表
    22. -- return M

    上述的代码好麻烦,lua5.1提供了一个函数,完成等价功能,只需要这样写:
    1. -- complex.lua
    2. -- module等价于上述一大段函数, package.seeall让这个模块可以访问_G中的变量
    3. -- 如果只调用mudule(...)就不能访问
    4. module(..., package.seeall)
    5. -- 定义模块函数,注意,模块名称被省略
    6. function add(c1,c2) ... end
    7. -- 调用模块内部的函数,需要complex.前缀
    8. function callAdd(c1,c2)
    9. add(c1,c2)
    10. end
    11. -- 不用返回这个表
    12. -- return M






  • 相关阅读:
    BZOJ1819 [JSOI]Word Query电子字典 Trie
    洛谷2973 [USACO10HOL]赶小猪Driving Out the Piggi… 概率 高斯消元
    BZOJ2669 [cqoi2012]局部极小值 状压DP 容斥原理
    BZOJ5047 空间传送装置 2017年9月月赛 最短路 SPFA
    BZOJ5045 打砖块 2017年9月月赛 其他
    BZOJ1858 [Scoi2010]序列操作 线段树
    BZOJ1826 [JSOI2010]缓存交换 堆 贪心
    BZOJ1898 [Zjoi2005]Swamp 沼泽鳄鱼 矩阵
    BZOJ1878 [SDOI2009]HH的项链 树状数组 或 莫队
    BZOJ1875 [SDOI2009]HH去散步 矩阵
  • 原文地址:https://www.cnblogs.com/dydx/p/4311519.html
Copyright © 2011-2022 走看看