zoukankan      html  css  js  c++  java
  • Lua中require,dofile,loadfile,dostring,loadstring,loadlib,load之间的区别

    Lua 是一种解释型语言,可以执行动态生成代码,正是因为存在dofile这样的函数;然而dofile 只是一个辅助函数,loadFile 才做了核心工作。LoadFile 会加载一段代码,只编译不执行,并把结果作为一个函数返回,可以多次调用;然而dofile是加载并执行,会造成多次开销,LoadFile 由于只编译一次,所以 开销却很少。

    说完了LoadFile 和DoFile 后,我们来谈一下 require ;require这个函数有意思了。我们require 通常是一个模块,比如Lua 文件或者C文件,并作为一个table 返回。下面我们来具体分析一些 require 都做了些什么。

    先上一段代码:

    function require(name)

    if not package.loaded[name] then

      local loader = findloader(name)

      if loader == nil then

        error("没找到 模块")

      end

      package.loaded[name] = true;

      local res = loader(name)

      if res ~= nil then

        package.loaded[name] = res;

      end

    end

    return  package.loaded[name]

    end

    上完代码后,我不过多解释,大概都可以看明白吧。

    package.loaded 中检查是否已加载,如果没有就创建加载器,如果有就直接返回,

    如果要强制require 某个模块2次的话,需要将package.laoded[name] = nil;

    require 进来后,并不执行。如果require 的是C文件,就需要package.loadlib 去加载。

    说一些loadstring :loadstring 用法和loadfile类似,但是性能开销很大,loadstring 是加载字符串,并把函数作为一个值返回 比如:

    f = loadstring("i = i + 1")

    f();

    如果有出错 就用 assert(f)() 输出log;

    每次调用loadstring都会被编译,而且是全局编译

    i = 32;

    local i = 0;

    f = loadstring("i = i+1; print(1)");

    g = function() i = i+1;print(i) end

    f(); ---->33

    g(); -->1

    loadfile 和loadstring 其实都是调用lua中原始函数load,load 加载程序块可以分多次返回一个程序块,知道返回nil为止,或者程序块过大无法放入内存中才用到它

  • 相关阅读:
    Struts2获取参数的几种方式
    Struts2的Action中访问servletAPI方式
    struts2中常用配置
    struts2发送ajax的几个问题(不使用struts2-json-plugin的情况下)
    深入Struts2的过滤器FilterDispatcher--中文乱码及字符编码过滤器
    Ironic 裸金属实例的部署流程
    Ironic 裸金属管理服务的底层技术支撑
    Cinder AZ 与 Nova AZ 的同步问题
    OpenStack 对接 Ceph 环境可以创建卷但不能挂载卷的问题
    OpenStack 节点重启后无法联网的问题
  • 原文地址:https://www.cnblogs.com/DOGame/p/8722180.html
Copyright © 2011-2022 走看看