Lua 通过元方法简单实现属性Get/Set访问

这篇具有很好参考价值的文章主要介绍了Lua 通过元方法简单实现属性Get/Set访问。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

通过元方法__index、__newindex、rawset,我们可以实现属性的Get/Set访问,类似于C#:

public string name;
public string Name
{
    get => name;
    set => name = value;
}

方法一:将属性数据存在元表中

local meta = { name = "meta" }
meta.__index = function(self, key)
	print("Get Key = " .. tostring(key))
	return meta[key]
end
meta.__newindex = function(self, key, value)
	print("Set Key = " .. tostring(key) .. " , value = " .. tostring(value))
	meta[key] = value
end
local table = {}
setmetatable(table, meta)
print("—— 1 ——")
print(table.name)
print("—— 2 ——")
table.name = "table"
print("—— 3 ——")
print(table.name)

---输出结果:
-- —— 1 ——
-- Get Key = name
-- meta
-- —— 2 ——
-- Set Key = name , value = table
-- —— 3 ——
-- Get Key = name
-- table

__index 可视为该table中所有属性的Get方法,通过参数Key区分不同的属性;
__newindex 可视为该table中所有属性的Set方法,通过参数Key区分不同的属性;
该方法的局限性在于,子表不得绕过元方法对属性进行修改(比如通过 rawset 方法),这是为了防止:因为子表有对应的属性,而无法触发到元表的 __index 方法
这也意味着,之后对于子表所有的属性获取与修改,都会反馈到元表上,子表永远都会是个空的table

方法二:将属性数据存在子表中

local meta = {
	__index = function(self, key)
		print("Get Key = " .. tostring(key))
		return self._TEMP_META_DATA_[key]
	end,
	__newindex = function(self, key, value)
		print("Set Key = " .. tostring(key) .. " , value = " .. tostring(value))
		rawset(self._TEMP_META_DATA_, key, value)
	end,
}
local table = {}
table._TEMP_META_DATA_ = {}
setmetatable(table, meta)
print("—— 1 ——")
print(table.name)
print("—— 2 ——")
table.name = 5
print("—— 3 ——")
print(table.name)

---输出结果:
-- —— 1 ——
-- Get Key = name
-- 
-- —— 2 ——
-- Set Key = name , value = 5
-- —— 3 ——
-- Get Key = name
-- 5

该方法的优势在于,对子表的修改都能反馈到子表上,并由此可以衍生许多进阶写法

未完待续……文章来源地址https://www.toymoban.com/news/detail-846271.html

到了这里,关于Lua 通过元方法简单实现属性Get/Set访问的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • lua脚本的基本语法,以及Redis中简单使用

    Lua 脚本的基本语法如下: 变量与赋值: 变量名可以是字母、数字和下划线的组合,以字母或下划线开头。Lua 是动态类型语言,无需事先声明变量类型。 控制结构: a) 条件语句: b) 循环语句: 函数定义: 函数可以有参数和返回值。 表(table): 表是 Lua 中的一种数据结构

    2024年02月04日
    浏览(38)
  • 如何在android运行lua脚本(最简单的讲解,一看就懂)

    1.打开 android studio 2.引入luaj-jse-3.0.1.jar包(百度自行下载) 3.新建assets文件夹 4.在assets文件夹下新建一个 main.lua文件,内容如下 5.MainActivity.java 内容如下 5.运行程序

    2024年02月11日
    浏览(24)
  • lua的元表与元方法理解

    在 Lua 中,元表(metatable)是一种特殊的表,用于定义另一个表的行为。每个表都有一个关联的元表,通过元表可以重载表的各种操作,例如索引、新索引、相加等。在 Lua 中,元表的使用非常灵活,可以实现各种高级特性,例如面向对象编程、迭代器等。 元表与表的关联是

    2024年02月10日
    浏览(30)
  • 【杂谈】“CommunityToolkit.Mvvm无法自动生成Get/Set属性对”的解决方案

    最近在实践MVVM,发现这玩意儿挺有意思的,有点WPF的最佳搭档的感觉。UI自动跟随VM变化,极大程度上简化各类逻辑。UI元素的各种属性也会实时反馈到VM上,直接在VM处理事务逻辑即可。 但是MVVM在WPF上应用,最烦的就是要自己写一大堆Get/Set,以及匹配 INotifyPropertyChanged 的调

    2024年02月08日
    浏览(32)
  • 【游戏逆向】Lua游戏逆向及破解方法介绍

    随着手游的发展,越来越多的Cocos-lua端游开发者转移到手游平台。Lua脚本编写逻辑的手游也是越来越多,如梦幻西游、刀塔传奇、开心消消乐、游龙英雄、奇迹暖暖、疾风猎人、万万没想到等手游。随着Lua手游的增加,其安全性更值得关注,在此归纳一些常用的分析方法,同

    2024年02月04日
    浏览(34)
  • lua 实现面向对象

    function class(super, classname)     local superType = type(super)     local cls     if superType ~= \\\"function\\\" and superType ~= \\\"table\\\" then         superType = nil         super = nil     end     if superType == \\\"function\\\" or (super and super.__ctype == 1) then         -- inherited from native C++ Object         cls = {}        

    2024年02月11日
    浏览(31)
  • Lua表实现类

    2024年02月07日
    浏览(38)
  • Lua语言实现游戏动作

    Lua是一种轻量级的脚本语言,它具有高效性、可扩展性和易学性等优点。在游戏开发领域,Lua语言得到了广泛应用。Lua语言可以用来实现游戏动作,包括角色行走、攻击、技能释放等。本文将详细介绍如何使用Lua语言实现游戏动作。 一、Lua语言介绍 Lua语言是一种轻量级的脚

    2023年04月14日
    浏览(29)
  • redis+lua实现限流

    2024年02月07日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包