元表参数不同版本有小不同,下面是最新版本详解:
1"add": + *** 作。 如果任何不是数字的值(包括不能转换为数字的字符串)做加法, Lua 就会尝试调用元方法。 首先、Lua 检查第一个 *** 作数(即使它是合法的), 如果这个 *** 作数没有为 "__add" 事件定义元方法, Lua 就会接着检查第二个 *** 作数。 一旦 Lua 找到了元方法, 它将把两个 *** 作数作为参数传入元方法, 元方法的结果(调整为单个值)作为这个 *** 作的结果。 如果找不到元方法,将抛出一个错误。
2"band": & (按位与) *** 作。 行为和 "add" *** 作类似, 不同的是 Lua 会在任何一个 *** 作数无法转换为整数时 尝试取元方法。
3"concat": (连接) *** 作。 行为和 "add" *** 作类似, 不同的是 Lua 在任何 *** 作数即不是一个字符串 也不是数字(数字总能转换为对应的字符串)的情况下尝试元方法。
"len": # (取长度) *** 作。 如果对象不是字符串,Lua 会尝试它的元方法。 如果有元方法,则调用它并将对象以参数形式传入, 而返回值(被调整为单个)则作为结果。 如果对象是一张表4且没有元方法, Lua 使用表的取长度 *** 作(。 其它情况,均抛出错误。
"eq": == (等于) *** 作。 和 "add" *** 作行为类似, 不同的是 Lua 仅在两个值都是表或都是完全用户数据 且它们不是同一个对象时才尝试元方法。 调用的结果总会被转换为布尔量。
"lt": < (小于) *** 作。 和 "add" *** 作行为类似, 不同的是 Lua 仅在两个值不全为整数也不全为字符串时才尝试元方法。 调用的结果总会被转换为布尔量。
5"le": <= (小于等于) *** 作。 和其它 *** 作不同, 小于等于 *** 作可能用到两个不同的事件。 首先,像 "lt" *** 作的行为那样,Lua 在两个 *** 作数中查找 "__le" 元方法。 如果一个元方法都找不到,就会再次查找 "__lt" 事件, 它会假设 a <= b 等价于 not (b < a)。 而其它比较 *** 作符类似,其结果会被转换为布尔量。
6"index": 索引 table[key]。 当 table 不是表或是表 table 中不存在 key 这个键时,这个事件被触发。 此时,会读出 table 相应的元方法。
尽管名字取成这样, 这个事件的元方法其实可以是一个函数也可以是一张表。 如果它是一个函数,则以 table 和 key 作为参数调用它。 如果它是一张表,最终的结果就是以 key 取索引这张表的结果。 (这个索引过程是走常规的流程,而不是直接索引, 所以这次索引有可能引发另一次元方法。)
7"newindex": 索引赋值 table[key] = value 。 和索引事件类似,它发生在 table 不是表或是表 table 中不存在 key 这个键的时候。 此时,会读出 table 相应的元方法。
同索引过程那样, 这个事件的元方法即可以是函数,也可以是一张表。 如果是一个函数, 则以 table、 key、以及 value 为参数传入。 如果是一张表, Lua 对这张表做索引赋值 *** 作。 (这个索引过程是走常规的流程,而不是直接索引赋值, 所以这次索引赋值有可能引发另一次元方法。)
8一旦有了 "newindex" 元方法, Lua 就不再做最初的赋值 *** 作。 (如果有必要,在元方法内部可以调用 rawset 来做赋值。)
9"call": 函数调用 *** 作 func(args)。 当 Lua 尝试调用一个非函数的值的时候会触发这个事件 (即 func 不是一个函数)。 查找 func 的元方法, 如果找得到,就调用这个元方法, func 作为第一个参数传入,原来调用的参数(args)后依次排在后面。
其实要是仔细看书的话就会发现
所谓的""不是特殊的语法,而是语法糖,所谓的语法糖 就是并非引入了新的概念,而只是一些缩写而已
例如
local t = {}ta = "aaa"
等价于
t["a"] = "aaa"
可以看出来 ""仍然表示访问这个表 但是是以点之后的内容的字符串为下标来访问
而且书上有提到过 点之后的内容 必须以英文字母或下划线开头,而不能以数字符号或汉字等其他字符开头
所以 用点访问 只是一种缩写的语法
至于有的时候甚至会看到使用冒号来访问
t:fun()这个其实也只是一个语法糖 并没什么新内容 具体的可以自行百度 我记得我在百度知道已经回答过很多次了
localt={1,3,5,7,9,11,13}localfun={}funmax=function(t)returnmathmax(unpack(t))endfuncount=function(t)return#tendprint(funcount(t))funsum=function(t)localsum=0fori,vinpairs(t)dosum=sum+vendreturnsumendfunavg=function(t)returnfunsum(t)/funcount(t)endfunmax=function(t)returnmathmax(unpack(t))endfunmin=function(t)returnmathmin(unpack(t))endfunvarp=function(t)localavg=funavg(t)localsub=0fori,vinpairs(t)dosub=sub+(v-avg)^2endreturnsub/funcount(t)endfunstddevp=function(t)returnmathsqrt(funvarp(t))endprint(funmax(t))print(funsum(t))print(funavg(t))print(funmax(t))print(funmin(t))print(funvarp(t))print(funstddevp(t))写这么多才给5分你也真够抠的这也是你对知识的不重视的表现
以上就是关于计算中什么是元表的参数全部的内容,包括:计算中什么是元表的参数、脚本语言LUA里 表的问题,具体见描述、lua输出全部数组, 这个数组长度不固定的,比如a[1]..a[2]..a[3],我想把整个数组的内容存到一个变量等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)