Lua中rawset和rawget的作用浅析

 更新时间:2015年04月22日 09:14:32   投稿:junjie  
这篇文章主要介绍了Lua中rawset和rawget的作用浅析,本文分别用两段代码演示了rawset和rawget的作用,需要的朋友可以参考下

rawget是为了绕过__index而出现的,直接点,就是让__index方法的重写无效。(我这里用到"重写"二字,可能不太对,希望能得到纠正)

复制代码 代码如下:

Window = {} 
 
Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,} 
Window.mt = {} 
function Window.new(o) 
    setmetatable(o ,Window.mt) 
    return o 
end 
Window.mt.__index = function (t ,key) 
    return 1000 
end 
Window.mt.__newindex = function (table ,key ,value) 
    if key == "wangbin" then 
        rawset(table ,"wangbin" ,"yes,i am") 
    end 
end 
w = Window.new{x = 10 ,y = 20} 
print(rawget(w ,w.wangbin)) 

打印结果是:nil。这里的元表中__index函数就不再起作用了。
但是rawset呢,起什么作用呢?我们再来运行一段代码。
复制代码 代码如下:

Window = {} 
Window.prototype = {x = 0 ,y = 0 ,width = 100 ,height = 100,} 
Window.mt = {} 
function Window.new(o) 
    setmetatable(o ,Window.mt) 
    return o 
end 
Window.mt.__index = function (t ,key) 
    return 1000 
end 
Window.mt.__newindex = function (table ,key ,value) 
    table.key = "yes,i am" 
end 
w = Window.new{x = 10 ,y = 20} 
w.wangbin = "55" 

然后我们的程序就stack overflow了。可见,程序陷入了死循环。因为w.wangbin这个元素本来就不存在表中,然后这里不断执行进入__newindex,陷入了死循环。

相关文章

  • 详解Lua中if ... else语句的使用方法

    详解Lua中if ... else语句的使用方法

    这篇文章主要介绍了详解Lua中if ... else语句的使用方法,是Lua入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Lua获取utf8字符串长度和字符串截取并用...代替

    Lua获取utf8字符串长度和字符串截取并用...代替

    这篇文章主要介绍了Lua获取utf8字符串长度和字符串截取并用...代替,本文直接给出两个函数的实现代码,需要的朋友可以参考下
    2015-04-04
  • Lua脚本语言简介

    Lua脚本语言简介

    这篇文章主要介绍了Lua脚本语言简介,Lua最著名的应用是在暴雪公司的网络游戏WOW中, Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用,本文就是对Lua语言的详细介绍,需要的朋友可以参考下
    2014-09-09
  • Lua返回一个Closures函数实例

    Lua返回一个Closures函数实例

    这篇文章主要介绍了Lua返回一个Closures函数实例,本文直接给出代码实例,需要的朋友可以参考下
    2015-04-04
  • 详解Lua中的if语句的使用方法

    详解Lua中的if语句的使用方法

    这篇文章主要介绍了详解Lua中的if语句的使用方法,是Lua入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Lua实现__add方法重载示例

    Lua实现__add方法重载示例

    这篇文章主要介绍了Lua实现__add方法重载示例,本文直接给出实现代码,需要的朋友可以参考下
    2015-04-04
  • 把Lua编译进nginx步骤方法

    把Lua编译进nginx步骤方法

    这篇文章主要介绍了把Lua编译进nginx步骤方法,本文讲解了操作步骤以及可能出现的错误解决方法,需要的朋友可以参考下
    2015-06-06
  • 使用lua实现php的var_dump()函数功能

    使用lua实现php的var_dump()函数功能

    小编比较熟悉php,所以这篇文章主要介绍了使用lua实现php的var_dump()函数功能,需要的朋友可以参考下
    2014-11-11
  • 浅谈Lua的面向对象特性

    浅谈Lua的面向对象特性

    这篇文章主要介绍了Lua的面向对象特性,包括对象和继承等传统OOP概念的几个关键知识点,需要的朋友可以参考下
    2015-05-05
  • Lua极简入门指南(六):模块

    Lua极简入门指南(六):模块

    这篇文章主要介绍了Lua极简入门指南(六):模块,本文讲解了require函数、编写模块、查找模块等内容,需要的朋友可以参考下
    2014-10-10

最新评论