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代码生成也不需 ...
随机推荐
- JAVA第四周作业
import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream; ...
- 如何通过JDBC访问数据库
Java数据库连接(JDBC)用与在Java程序中实现数据库操作功能,它提供了执行SQL语句.访问各种数据库的方法,并为各种不同的数据库提供统一的操作接口,java.sql包中包含了JDBC操作数据库 ...
- [转]OC与JS的交互详解
事情的起因还是因为项目需求驱动.折腾了两天,由于之前没有UIWebView与JS交互的经历,并且觉得这次在功能上有一定的创造性,特此留下一点文字,方便日后回顾. 我要实现这样一个需求:按照本地的CSS ...
- display:inline-block 和float:left 的区别
display:inline-block 和float:left 的区别 display是指显示状态,float是针对块级元素的浮动. 使用inline-block:控制元素的垂直对齐跟横向排列元 ...
- Spark相关错误汇总
前面介绍了Spark开发环境的搭建,下面将在实际开发过程中遇到的一些问题汇总一下: 1.Exception in thread "main" com.typesafe.config ...
- 各种url编码
URLENCODE和URLDECODE是比较常用的URL参数转换方法,为以后使用方便,自己归类一下. 一.JavaScript: 编码:encodeURIComponent(URIString) ...
- .NET连接SAP系统专题:BAPI_TRANSACTION_COMMIT的使用方法(十)
from:http://scnblogs.techweb.com.cn/mengxin/archives/5.html 为什么.net调用SAP的BAPI接口需要调用BAPI_TRANSACTION_ ...
- [解决方案] pythonchallenge level 6
查看页面代码,知道找zip www.pythonchallenge.com/pc/def/channel.zip,查看zip下的readme.txt知道从90052,跑一遍知道要收集zip的comme ...
- 表前缀sw_时
操作效果一样
- 上传文件swfUploadConfig.js
/*/* * Unobstrusive swf upload widget using jQuery. *example : $(':file.uo_widget_form_input_file_sw ...