peanut

peanut 查看完整档案

北京编辑安徽工业大学  |  泥土挖掘与移动 编辑  |  填写所在公司/组织填写个人主网站
编辑

好好学习,天天向上。

个人动态

peanut 关注了标签 · 2018-03-25

关注 29

peanut 赞了文章 · 2018-02-05

LUA元表和元方法


元表

Lua中每个值都可具有元表。 元表是普通的table,定义了原始值在某些特定操作下的行为。你可通过在值的原表中设置特定的字段来改变作用于该值的操作的某些行为特征。例如,当数字值作为加法的操作数时,Lua检查其元表中的"__add"字段是否有个函数。如果有,Lua调用它执行加法。

我们称元表中的键为事件(event),称值为元方法(metamethod)。前述例子中的事件是"add",元方法是执行加法的函数。

不能从Lua中改变其他类型的元表(除了使用调试库);必须使用C API才能做到。表和完整的用户数据具有独立的元表(尽管多个表和用户数据可共享元表);每种其他类型的所有值共享一个元表。所以,所有数字共享一个元表,字符串也是,等等。

一个 metatable 可以控制一个对象做数学运算操作、比较操作、连接操作、取长度操作、取下标操作时的行为, metatable 中还可以定义一个函数,让 userdata 作垃圾收集时调用它。 对于这些操作,Lua 都将其关联上一个被称作事件的指定健。 当 Lua 需要对一个值发起这些操作中的一个时, 它会去检查值中 metatable 中是否有对应事件。 如果有的话,键名对应的值(元方法)将控制 Lua 怎样做这个操作

每种操作都有元表(xx的元表__xx):sub,mul,div,mod,pow,unm,concat,len,eq,lt,le,index,newindex,call

其中,__index是取下标操作用于访问 table[key], __newindex是赋值给指定下标 table[key] = value, __call是当Lua调用一个值时调用

setmetatable & getmetatable

设置和查询元表值,setmetatable(只能用于table)和getmetatable(用于任何对象)

下面例子为一个table设置加操作

重载操作符

local mt = {}
function mt.__add(a, b)
    return 'table + ' .. b
end
local t = {}
setmetatable(t, mt)
print(t + 1)  -- table + 1

面向对象模拟

使用metatable可以模拟出面向对象

local Bird = {}
function Bird:new()
    local b = {isDead = false}
    setmetatable(b, self)
    self.__index = self
    return b
end
function Bird:fly()
    print("fly ~~~")
end

local bird1 = Bird:new()
print(bird1:fly())  -- fly ~~~
print(bird1.isDead)  -- false

这里利用index元表,当我们访问一个表中的元素不存在时,则会触发去寻找__index元方法。所以就可以模拟出类的封装。

Cocos2d-x-lua里有更完善的类和继承的class模拟

table保护

table通过对newindex元表的值处理,可以保护table不被修改

例如cocos2d-x里有个这样屏蔽全局变量的函数:

function cc.disable_global()
    setmetatable(__g, {
        __newindex = function(_, name, value)
            error(string.format("USE \" cc.exports.%s = value \" INSTEAD OF SET GLOBAL VARIABLE", name), 0)
        end
    })
end

rawset & rawget

rawget 和 rawset 这两个函数,可以避免Lua使用 __index 和 __newindex。一般用在index,newindex元表中以避免死循环。

local Bird = {}
function Bird:new()
    local b = {isDead = false}
    setmetatable(b, self)
    self.__index = function(t, key)return 1000 end
    return b
end

w = Bird:new()  
print(w["haha"])  -- 1000
print(rawget(w, w["haha"]))  -- nil
w["haha"] = 10
print(w["haha"])  -- 10
print(rawget(w, w["haha"]))  -- nil
rawset(w, w["haha"], 1)
print(w["haha"])  -- 10
print(rawget(w, w["haha"]))  -- 1
查看原文

赞 2 收藏 3 评论 0

peanut 关注了标签 · 2018-02-01

lua

Lua 程序设计语言 是一个简洁、轻量、可扩展的脚本语言。他的目标是成为一个很容易嵌入其它语言中使用的语言。很多应用程序使用Lua作为自己的嵌入式脚本语言,以此来实现可配置性、可扩展性。

关注 700

peanut 回答了问题 · 2017-11-20

PHP fopen的w和w+模式的区别

关注 4 回答 3

peanut 提出了问题 · 2016-07-29

解决ajax 请求接口 返回本身url的html

$.ajax({

        type: "post",
        URL: href+'/demo/showPageNewMesssage',
        data: {
            p: recoIndexObject.pageNumber
        },
按理说应该href+'/demo/showPageNewMesssage'响应数据的,为什返回的是触发ajax 的元素所在页面的html信息。

关注 4 回答 3

peanut 关注了问题 · 2016-03-09

求解困扰我几天的关于SQL查询条件、排序、各种索引等一系列问题

问题背景如下:针对以下这种查询sql

SELECT Id,title,Content,summary,date,hitnum FROM TbName WHERE 1=1 and CONTAINS(title,'"aaa"') and CONTAINS(Content,'"bbb"') ORDER BY date desc,hitnum desc

以上sql所涉及的title和Content字段我已经做了全文索引或简单索引,在此前提下,我是不是再建立一个如下的有关排序的非聚集索引就可以了?这个语句这样写可以吗?需要带ORDER BY 吗?

create nonclustered index NonClu_IX_TbName_fans_ci on Contenta (date desc,hitnum desc)

问题一:以上问题是否像我上面所说的这样就可以了呢???

如果是的话,那么,由此我也想到下面几个一直困惑我的问题:

问题二:一般滴,当我们建立索引时,是建立排序部分的索引(ORDER BY那一部分)重要,还是建立条件部分的索引(WHERE……那一部分)更加重要??

问题三:条件部分的索引和排序部分的索引是不是分别建立就可以了?还是最好将二者联合在一起、找出各种组合的可能并同时建立呢?那是不是意味着这是一个排列组合的问题了,有几张可能就建立几种索引吗?

问题四:查询条件字段数不一样的话(有时候是按两个条件查询、有时候是按5个条件查询),那么要对每一种组合的查询条件都建立非聚集索引吗?

问题五:当我们把作为主键的ID建立为聚集索引的基础上,我们还把各种查询和排序涉及到的其他字段都建立了全文索引,此时,是不是不管用什么字段组合构成查询的条件,都不再再对这些字段建立非聚集索引,而只需要就各种排序做索引就基本上完成了这个系统所有的索引相关的任务了呢?

问题六:存储过程又是为了什么呢?我的这个程序有一个特点就是不给用户开放任何添加数据、修改数据和删除数据的功能,只开放查询功能,这样的话,是不是就不需要存储过程了呢?

以上所有问题,大家请首先按照【问题六】所说的我的这个系统的特点来考虑和回答,这将有助于我解决我目前遇到的实际问题,但是,我还希望大家可以就一般网站的情况也解答一下,以便我了解这个问题的实质。

以上问题逐一环扣,请各位大哥逐一帮我解惑好吗?一个问题给我写一个答案好吗?或者您知道几个就回答几个也行,谢谢!

关注 5 回答 2

peanut 赞了回答 · 2016-03-03

PHP压缩字符串,javascript解压缩的东西

Gzip等都是成熟的压缩算法,PHP扩展里也带有。不过网页本身就能通过Gzip进行压缩,也就没有必要再把里面的字符串再压缩一遍了。

关注 6 回答 4

peanut 关注了问题 · 2016-03-03

解决PHP如何禁止外网访问

某个PHP文件,如果禁止外网访问,即这个PHP仅限服务器访问
因为很多数据需要用到定时任务定时运行php脚本生成,以防外网或蜘蛛运行此PHP而生成错误的数据,所以需要屏蔽外网,只限服务器访问。

关注 11 回答 6

peanut 赞了回答 · 2016-02-27

在网速很慢时http是如何完成一个大文件传输的呢?

http就是普通的tcp协议,传输文件也就是一个比较大的请求而已。如果你不加任何优化,那传输的过程也就极其简单,就是慢慢传。网速的快慢不会影响对传输过程的实现。不过要注意的是,如果是因为网络不可靠引起的网速慢,也就是说tcp连接会因为网络短暂中断而失去连接,那么按你这样不做优化去直接上传,也会因为丢失连接而失败。

关注 3 回答 2

peanut 回答了问题 · 2016-02-27

解决php prepare error

用的哪个database呀。

关注 2 回答 1

认证与成就

  • 获得 5 次点赞
  • 获得 19 枚徽章 获得 0 枚金徽章, 获得 7 枚银徽章, 获得 12 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2015-04-25
个人主页被 161 人浏览