lua metatables中__newindex

reference:

http://www.lua.org/manual/5.3/manual.html

 

__newindexThe indexing assignment table[key] = value. Like the index event, this event happens when table is not a table or when key is not present in table. The metamethod is looked up in table.

Like with indexing, the metamethod for this event can be either a function or a table. If it is a function, it is called with tablekey, and value as arguments. If it is a table, Lua does an indexing assignment to this table with the same key and value. (This assignment is regular, not raw, and therefore can trigger another metamethod.)

Whenever there is a __newindex metamethod, Lua does not perform the primitive assignment. (If necessary, the metamethod itself can call rawset to do the assignment.)

 

__newindex 用来对表更新,__index 则用来对表访问。

metamethod 为function

示例:

student = {}
student_info = {["name"] ="andrew"}
student_info.__newindex = function(t, key, value)
  rawset(t,key,value)
end 
student = setmetatable({},student_info)
student.gender = "male"
student.name = "alex"

print(student_info.gender, student_info.name)
print(student.gender,student.name)

执行结果:

nil	andrew
male	alex

metamethod 为table

示例1:

student_info = {["name"] ="andrew"}
student = setmetatable({},{__newindex=student_info})
student.gender = "male"
student.name = "alex"

print(student_info.gender, student_info.name)
print(student.gender,student.name)

执行结果:

male	alex
nil	nil

示例2:

student = {"hello"}
student_info = {["name"] ="andrew"}
student = setmetatable(student,{__newindex=student_info})  --line 3
--student = setmetatable({},{__newindex=student_info})
student.gender = "male"
student.name = "alex"

print(student_info.gender, student_info.name,student_info[1])
print(student.gender,student.name, student[1])

执行结果:

male	alex	nil
nil	nil	hello

示例3:

student = {"hello"}
student_info = {["name"] ="andrew"}
--student = setmetatable(student,{__newindex=student_info})
student = setmetatable({},{__newindex=student_info})   --line 4
student.gender = "male"
student.name = "alex"

print(student_info.gender, student_info.name,student_info[1])
print(student.gender,student.name, student[1])

执行结果:

male	alex	nil
nil	nil	nil

 

转载于:https://my.oschina.net/u/2326611/blog/841088

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值