lua Getter&Setter简单实现

lua是一门简单的语言,不带类和属性封装,但可以使用lua强大的元表模拟实现:

class.lua

local type = type
local rawset = rawset
local setmetatable = setmetatable

local traceCount = 0
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 + 1
        tracebacks[self] = traceCount

        return self
    end

    -- compat
    cls.dtor = nil
    function cls.delete(self)
        if tracebacks[self] < 0 then return end
        local destroy
        destroy = function(cls)
            if cls.dtor then
                cls.dtor(self)
            end
            if cls.super then
                destroy(cls.super)
            end
        end
        destroy(cls)
        tracebacks[self] = -tracebacks[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(10, 20)
print(p.x, p.y)
p.x = 5
p.y = 5
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 = 30
obj.y = 40

obj.y = obj.x

这样做的好处就是,可以比较自然的访问和赋值一些变量,特别是UI布局中,可以少写很多setXX、getXX的方法。

时间: 2024-11-07 21:36:32

lua Getter&Setter简单实现的相关文章

Java程序员的JavaScript学习笔记(4——闭包/getter/setter)

计划按如下顺序完成这篇笔记: 理念. 属性复制和继承. this/call/apply. 闭包/getter/setter. prototype. 面向对象模拟. jQuery基本机制. jQuery选择器. jQuery工具方法. jQuery-在"类"层面扩展. jQuery-在"对象"层面扩展. jQuery-扩展选择器. jQuery UI. 扩展jQuery UI. 这是笔记的第4篇,聊聊闭包/getter/setter,看看JavaScript中的变量作

Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript学习笔记(3--this/call/apply) Java程序猿的JavaScript学习笔记(4--this/闭包/getter/setter) Java程序猿的JavaScript学习笔记(5--prototype) Java程序猿的JavaScript学习笔记(6--面向对象模拟) Ja

lua 对表的简单序列化与反序列化

参考文档:http://blog.csdn.net/xiaodan007/article/details/7096718 function sz_T2S(_t) local szRet = "{" function doT2S(_i, _v) if "number" == type(_i) then szRet = szRet .. "[" .. _i .. "] = " if "number" == ty

10.getter &amp; setter

自定义 Person 类 class Person: NSObject { var name: String? var age: Int? } getter & setter var _name: String? var name: String? { get { return _name } set { _name = newValue } } 在 Swift 中以上形式的 getter & setter 很少用 didSet 在 OC 中,我们通常希望在给某一个变量赋值之后,去做一些额

Lombok(1.14.8) - @Getter, @Setter, @ToString, @EqualsAndHashCode &amp; @Data

@Getter / @Setter @Getter 和 @Setter,分别实现了 Gette r和 Setter 方法. package com.huey.hello.bean; import java.util.Date; import lombok.Getter; import lombok.Setter; public class Student { @Getter @Setter private int studNo; @Getter @Setter private String st

iOS getter setter

getter setter 给成员变量起名字用的 setter方法 设置成员变量值 1. setter 方法一定是对象方法 不可能是类方法 2.一定没有返回值 3. 以set开头,并且set后面跟上需要设置的成员白能量的名称去掉下划线,并且首字母大写 4. 一定有参数 参数类型一定要和成员变量的类型一直 参数名称就是成员变量名称去掉下划线 getter方法用于返回成员变量的值 1. getter 一定是对象方法 2. 一定有返回值 返回值一定和获取的成员变量类型一致 3. 方法名称就是获取的成员

lombok注解为java类生成Getter/Setter方法

1. 先到lombok官网下载lombok.jar包 : http://projectlombok.org/ 2. 下载了之后的两种安装方法: 1. 双击下载下来的 JAR 包安装 lombok 我选择这种方式安装的时候提示没有发现任何 IDE,所以我没安装成功,我是手动安装的.如果你想以这种方式安装,请参考官网的视频. 2.eclipse / myeclipse 手动安装 lombok 1. 将 lombok.jar 复制到 myeclipse.ini / eclipse.ini 所在的文件夹

es6 getter setter

https://stackoverflow.com/questions/34517538/setting-an-es6-class-getter-to-enumerable 1. 我要 getter 没有要暴露 class A { get age() { return 11; } } console.log(Object.keys(new A())); // [] 翻译 es5 var A = /** @class */ (function () { function A() { } Objec

idea中Lombok的Buider构造器模式,getter/setter正确使用方法

public class ApiUser implements Serializable { private Long id; /*** * 用户类型:single,org(organization) */ private String type; private String loginName; /*** * 身份证姓名/组织机构名称 */ private String name; /** * 身份证号码/营业执照号码 */ private String idNum; private Str