lua Getter&Setter简单实现
lua是一门简单的语言,不带类和属性封装,但可以使用lua强大的元表模拟实现:
class.lua
local type = type
local rawset = rawset
local setmetatable = setmetatable local traceCount =
local tracebacks = setmetatable({}, {__mode = "k"}) local function class(classname, super)
local cls = {} cls.classname = classname
cls.class = cls
cls.Get = {}
cls.Set = {} local Get = cls.Get
local Set = cls.Set if super then
-- copy super method
for key, value in pairs(super) do
if type(value) == "function" and key ~= "ctor" then
cls[key] = value
end
end -- copy super getter
for key, value in pairs(super.Get) do
Get[key] = value
end -- copy super setter
for key, value in pairs(super.Set) do
Set[key] = value
end cls.super = super
end function cls.__index(self, key)
local func = cls[key]
if func then
return func
end local getter = Get[key]
if getter then
return getter(self)
end return nil
end function cls.__newindex(self, key, value)
local setter = Set[key]
if setter then
setter(self, value or false)
return
end if Get[key] then
assert(false, "readonly property")
end rawset(self, key, value)
end function cls.new(...)
local self = setmetatable({}, cls)
local function create(cls, ...)
if cls.super then
create(cls.super, ...)
end
if cls.ctor then
cls.ctor(self, ...)
end
end
create(cls, ...) -- debug
traceCount = traceCount +
tracebacks[self] = traceCount return self
end return cls
end return class
示例:
local class = require "class" local Point = class("Point") function Point:ctor(x, y)
self.x = x
self.y = y
end function Point.Get:x() return self._x end
function Point.Set:x(value) self._x = value end function Point.Get:y() return self._y end
function Point.Set:y(value) self._y = value end local p = Point.new(, )
print(p.x, p.y)
p.x =
p.y =
print(p.x, p.y)
local class = require "class" local Sprite = class("Sprite") function Sprite:ctor()
self.cobj = cc.Sprite:create()
end function Sprite.Get:x() return self.cobj:getPositionX() end
function Sprite.Set:x(value) self.cobj:setPositionX(value) end function Sprite.Get:y() return self.cobj:getPositionY() end
function Sprite.Set:y(value) self.cobj:setPositionY(value) end local obj = Sprite.new()
obj.x =
obj.y = obj.y = obj.x
这样做的好处就是,可以比较自然的访问和赋值一些变量,特别是UI布局中,可以少写很多setXX、getXX的方法。
lua Getter&Setter简单实现的更多相关文章
- Java程序猿JavaScript学习笔记(4——关闭/getter/setter)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- lombok(@Getter&@Setter)
Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法. 官方地址:https://project ...
- 自动生成getter setter
如何使用java黑魔法给一个entity生成getter,setter方法? 由于java是一门静态语言,要给一个类动态添加方法,看似是不可能的.但牛B的程序员会让任何事情发生.我只知道有两种方式可以 ...
- idea中使用插件lombok简化java bean的getter/setter/log等常用功能
一.安装. 1. 2. 3. 4. . 二.使用 1. 2. 3. 结果分析,如果没有添加@Setter注解,则LombokTest中的student示例无法使用setAge()等方法.使用lombo ...
- 懒加载(getter\setter理解)
为什么要用懒加载 1.首先看一下程序启动过程:(如图) 会有一个mian的设置,程序一启动会加载main.storyboard main.storyboard又会加载箭头所指的控制器 控制器一旦加载, ...
- iOS getter setter
getter setter 给成员变量起名字用的 setter方法 设置成员变量值 1. setter 方法一定是对象方法 不可能是类方法 2.一定没有返回值 3. 以set开头,并且set后面跟上需 ...
- cocos2d-x lua与c++简单交互
cocos2d-x lua与c++简单交互 version: cocos2d-x 3.6 本文讲述lua与c++的一些简单交互: lua通过消息方式调用c++无参接口 c++调用lua带参接口 1.通 ...
- Lombok(1.14.8) - @Getter, @Setter, @ToString, @EqualsAndHashCode & @Data
@Getter / @Setter @Getter 和 @Setter,分别实现了 Gette r和 Setter 方法. package com.huey.hello.bean; import ja ...
- lombok @Getter @Setter 使用注意事项
lombok是一个帮助简化代码的工具,通过注解的形式例如@Setter @Getter,可以替代代码中的getter和setter方法,虽然eclipse自带的setter.getter代码生成也不需 ...
随机推荐
- JDK安装与环境变量配置
1.安装JDK 选择安装目录 安装过程中会出现两次 安装提示 .第一次是安装 jdk ,第二次是安装 jre .建议两个都安装在同一个java文件夹中的不同文件夹中.(不能都安装在java文件夹的根目 ...
- C++线程池
之前一直在找一个开源的C++线程池库,找了很久也没有找到一个好用的,后来项目需要, 本想自己写一个,但是无意中在github上面找了一个采用boost库实现的threadpool,后来研究 了一下源码 ...
- Command Pattern
当(客户)对象访问(服务)请求服务时,最直接的方法就是方法调用.
- TextView 常用摘要
1.代码中设置drawableTop TextView textView = new TextView(getActivity()); Drawable drawable = getResources ...
- Why sql is called structured query language?1 - 12
SQL has much to do with a researcher at IBM, Edgar F. (Ted) Codd, an Oxford-trained mathematician, w ...
- Selenium 2 入门
在多个浏览器中进行 Web 应用程序的端到端功能测试 Selenium 是一款有名的 Web 应用程序测试框架,用于进行功能测试.新版本 Selenium 2 结合了 Selenium 1 和 Web ...
- 【汇总】Android 常用方法整理
1.解决ActionBar OverFlow按钮不显示.(在oncreate中调用即可) private void setOverflowShowingAlways() { try { ViewCon ...
- understand equal and gethashcode
Supposed we have a class below public class TestHash { public int x; int y; public TestHash(int x, i ...
- js判断是否存在指定变量或函数
//是否存在指定变量 function isExitsVariable(variableName) { try { if (typeof(eval(variableName)) == "un ...
- 移动web开发准备知识点
1.1.1 流式布局 其实 流式布局 就是百分比布局,通过盒子的宽度设置成百分比来根据屏幕的宽度来进行伸缩,不受固定像素的限制,内容向两侧填充. 这样的布局方式 就是移动web开发使用的常用布局 ...