创建纯数组( pure-array ),参数可以为空。
纯数组的数据类型也是表( table ), 但主要用于创建与操作稠密数组。
纯数组传入 table.isArray,table.isArrayLike 函数都会返回 true 。
纯数组在使用 table.tostring 或 JSON.stringify 等序列化后总是使用 []
包围数组成员。
如果参数@1为空,且参数 @ 2是函数或类,
则循环调用参数 @2 直到函数返回 null 值,
每次取首个返回值放入一个纯数组,并返回该数组。
参数 @2 不可使用无状态的迭代器。
可使用不定个数长度参数指定多维数组长度,
最后一个参数可以是创建默认值的函数或类,并在后面指定调用参数
可使用不定个数长度参数指定多维数组长度。例:
table.array(3,5,[] )
。
如果默认值是 table 对象使用浅拷贝方式复制数组成员为纯数组。
如果参数 @1 是函数或类,
这时候会循环调用参数 @1 直到函数或类返回 null 值。
每次调用的所有返回值放到一个纯数组中,
返回包含这些纯数组的纯数组。
如果只想返回包含首个返回值的一维数组,
请添加一个 null 参数,将参数 @1 移动到参数 @2 位置。
参数 @1 可指定有状态的迭代器,不支持无状态的迭代器。
如果参数 @1 为表或数组,
则获取所有数组成员并复制(浅拷贝)到新的纯数组中。
返回纯数组,如果指定最小长度则使用 length 元属性声明最小长度。
最小长度为 -1 时则自动获取最大数值索引作为最小长度。
length 仅对 JSON.stringify 等特定函数有效,跨线程传递数组时也会丢弃 length 元属性。
覆盖式混入表,
支持覆盖已存在的值,不支持递归混入成员表,
此函数不复制元表。
table.mix 函数混入表但不覆盖已存在的值
table.clone函数递归混入成员且复制元表
参数@1为空则创建新表,
使用后面的对象混入前面的对象(浅拷贝),并返回该对象
该函数仅修改第一个参数(混入目标) ,覆盖已存在的键值
此函数不会覆盖已存在的只读成员
除参数@1,其他任何参数为 null 则停止合并返回结果
递归式混入表、支持递归混入嵌套的成员表。
此函数使用深拷贝方式复制对象,但会丢弃对象的元表。
将参数列表中后面的表对象深度混入前面的表对象,并返回合并后的表对象。
实际上就是返回参数 @1 指定的表对象( 如果参数 @1 为空则默认创建新表作为合并的目标 )。
在混合表对象时如果遇到已存在的键值,并且目标值与源值都是表对象,
则继续使用 table.assignDeep 递归混入子表(合并子表而非替换已存在值),
否则以深拷贝的方式复制键值到目标表内(这会替换已存在的键值)。
此函数总是使用深拷贝,并支持递归混合子表,要避免用于复制在子元素中递归引用自身的表。
创建并返回弱引用缓存表,
弱引用指的是加入表中的键或值不会增加引用计数,
不会阻止对象被回收,
返回的弱引用表适合用于缓存对象
创建并返回弱引用缓存表,
可选用参数 @getter 指定读取值函数,
该函数的参数为当前读取的键,函数应返回对应的值,
在返回读取值以前,该值会被临时存入缓存表
创建并返回弱引用缓存表,
可选用参数 @kv 指定弱引用类型,
参数@1为字符串 "k" 时仅弱引用键,为 "v" 仅弱引用值,
不指定刚默认为 "kv", 指弱引用键与值。
可选用参数 @getter 指定读取值函数,
该函数的参数为当前读取的键,函数应返回对应的值,
在返回读取值以前,该值会被临时存入缓存表
清空参数 @1 指定的表对象内所有键值
创建表对象,
如果指定了原型表,则返回对象使用_get元方法指向该原型表,
返回表对象可以共享原型表中的成员,但不会复制并存储原型表的成员
如果指定了混入对象,则会将混入对象的成员实际复制到返回的表对象内,
混入规则与 table.assign 一致,按参数顺序从前向后混入,
忽略已存在的只读成员
清空预定义键名
预定义一个或多个键名
即使对应键的值为 null,仍然在 eachName 迭代器中显示出来
注意该迭代器的预定排序对null值无效,
此函数在对象的元表的 _define 元属性添加键名,
如果 _define 为数组或 null 则可重复调用此函数。
如果 _define 已经定义为函数对象则会失败
table.eachName,webs.json 等自动支持 _define 元属性
迭代器,
从索引1到最大索引迭代所有元素值,包含中间的null值
for i,v in table.eachIndex(/*可用于遍历纯数组、类数组、伪数组等表对象的数组元素。
按数组索引大小顺序遍历数组。
支持使用表对象的 length 属性,_length 元方法确定数组的长度。
支持表对象使用 _startIndex 元属性自定义下标。
如果是普通的纯数组不需要用到这些功能。
改用计数 for 循环会更快*/){
}
for k,v in table.eachName(/*使用表中的键排序并遍历所有键值对
参数: @1表对象, @2排序函数, @3排序表
调用table.keys获取排序后的键名,支持_keys,_defined元方法
所有参数用法与table.keys相同*/){
}
for k,v in table.eachValue(/*使用表中的值排序并遍历所有键值对,
默认值最小的排在前面,可选在后面指定排序函数,
排序函数的v,v2参数为正在比较的成员值,owner参数为表自身,
如果要v排在前面返回true,请用<或>比较,不要用>=或<=
省略排序值的函数则值小的排在前面*/,lambda(a,b) a > b ){
}
table.every(/*调用后面的回调函数计算表的每个值是否符合条件*/,function(v,k){
})
table.filter(/*调用后面的回调函数筛选并返回新数组
回调函数返回真值时添加该值到新数组中*/,function(v,index){
})
在表包含的所有键值对象搜索匹配的值,找到第一个值就返回对应的键。
以值查键才需要调用此函数,以键查值请改用下标操作符直接检索,例如:
if( tabObject["keyName"] ) {}
遍历表中所有的值,返回匹配成功的键
,值
(返回值有 2 个)。
并调用参数 @2 指定的回调函数,直到回调函数返回 true 时返回匹配的键
,值
。
回调函数参数为(当前值,当前键,表对象)
在表对象中以值查键。
在表中搜索所有键值对,并使用恒等操作符匹配相等的值。
找到第一值值就返回对应的键,找不到则返回 null
遍历表中所有的非函数值,
并调用参数 @2 指定的回调函数,
回调函数接收到的参数为(当前值,当前键,表对象)。
回调函数返回 true 则当前键
添加到 table.findAll 函数的返回值(数组)中。
table.findAl 的返回值为由表对象中所有匹配成功的键
数组,无任何匹配值返回空数组。
在表包含的所有键值对象搜索匹配的值,返回这些值对应的键
组成的数组。
使用恒等操作符查找并匹配值(数据类型与值都必须完全相等,不会自动转换类型)。
找不到返回空数组,可使用 #
操作符取数组长度判断查找结果。
展开@array 参数指定的数组中嵌套的数组并返回新数组,
此函数不会修改传入参数而是返回新数组,
可选用 @depth 参数指定要允许展开的嵌套深度,默认值为1
添加对象在销毁前执行的析构函数
按调用 table.gc 顺序的逆序析构对象,
最后调用 table.gc 标记的对象会最先执行析构函数
指定析构函数名,返回参数@1
函数名可以是之后创建的成员函数,
析构函数的 owner 参数为这里指定的 table 对象,
如果指定的成员函数在析构时为逻辑false或null值,则忽略析构.
注意析构函数不应抛出异常
指定析构函数,返回参数@1
注意析构函数不应抛出异常,
析构函数的 owner 参数为这里指定的 table 对象
创建一个被保护的对象析构函数,
此析构函数只会在对象被自动回收时自动触发,
主动调用此析构函数将被忽略
dtor 参数指定使用 table.gc 标记的析构对象的析构函数,
此函数将返回一个新的用于覆盖原析构函数的函数,
应将返回的析构函数重新赋值为对象的同名析构函数
调用成员(属性)操作符获取对象的键值。
如果对象实际包含 @member 参数指定键的值则直接返回。
否则调用 _get 元方法获取指定键的值,元方法第 3 个参数(@ownnerCall)设为 false。
使用索引下标 [] 获取键值触发 _get 元方法时 @ownnerCall 参数为 null 。
返回两个值:名字路径指向对象,该对象所在的表.
参数一为表内名字空间路径,参数二可选指定查找路径的表对象,
默认在global全局对象内查找路径
要注意此函数会触发表的元方法,
而 namespace 语句以及 table.namespace 函数不会触发元方法
以 ownerCall 方式获取函数对象。
ownerCall 指形如 object.method() 格式的函数调用语句。
函数内的 owner 参数设为成员操作符前面的 object 对象。
如果对象使用 _get 元方法返回函数,
则 _get 元方法的 ownerCall 参数为 true 。
如果对象实际包含 "funcName" 指定的成员则直接返回。
否则模拟 object.funcName() 格式触发 _get 元方法,获取函数对象(但不会调用该函数)。
调用 _get 元方法时 ownerCall 参数为 true。
适用于对 object.funcName() , object["funcName"] 区分处理的对象,
例如 .NET 对象。
在数组中自前向后查找参数@2指定的值并返回对应的数组索引,,
开始索引省略时默认值为1,可用负数表示自尾部开始的倒计数索引值,
无任何匹配值时返回null,有匹配值时返回大于或等于1的索引值
翻转参数 @1 指定表对象的键值对,
使值变为键,键变为值。
检测参数是否纯数组( pure-array ),。
注意纯数组的数据类型也是表( pure-array table ),
纯数组是起始索引为 1 的稠密数组,但也可以包含其他类型的键值对。
可以使用以下方式创建纯数组:
[]
构造纯数组。在 []
构造器内 []
只能表示子数组,不能用于包含索引。
参数 @1 如果是类数组(array-like table)则返回 true,否则返回 false。
类数组
是指纯数组(pure-array)或包含稠密数组成员的表
(用 #
操作符取到非零长度)。
类数组
可使用 #
操作符获取稠密数组成员的长度,可使用
for(i=1;#arrayLike;1){ var v = arrayLike[i] }
的方式遍历数组元素。
获取表中的所有字符串类型的键名(不含 _struct),
如果元表中定义了 _keys 元属性或元方法,则使用 _keys 获取全部键名数组取代对象实际的键名数组。
如果元表中定义了 _defined 元属性或元方法法,则使用 _defined 获取允许值为 null 的键名。
_keys 的作用是替换键名数组,而 _defined 的作是预定义部分键名(既使没有包含实际的键值)。
可选指定键名排序函数,如果不指定则使用默认字典序排序,
可选使用参数 @3 预定义优先排序在最前面的键名数组
在数组中自后向前查找参数@2指定的值并返回对应的数组索引,
开始索引省略时默认值为1,可用负数表示自尾部开始的倒计数索引值,
无任何匹配值时返回null,有匹配值时返回大于或等于1的索引值
获取纯数组、类数组、或伪数组(pseudo-array)的长度。
获取长度步骤如下:
#
操作符获取的长度中取最大值返回。#
操作符获取的长度中取最大值返回。#
操作符获取的稠密数组成员的长度。JSON.stringify 将调用此函数以支持定长数组。
table.map(/*应用后面的回调函数计算每个表成员的新值并返回新表,
此函数不会修改参数中传入的表而是返回新表,
回调函数的参数v为值,k为键,result为返回的表
回调函数如果不返回值或返回null时忽略不操作
因此可选通过result修改键值而不是返回新值*/,function(v,k,result){
})
table.map(/*应用后面的 lambda 函数计算每个表成员的新值并返回新表,
此函数不会修改参数中传入的表而是返回新表,
lambda 函数的参数v为值,k为键
nlambda 函数返回null时忽略不操作*/,lambda(v,k) v[1] )
table.mapDeep(/*应用后面的回调函数计算新值并返回新表,
此函数不会修改参数中传入的表而是返回新表,
如果遇到成员值是一个表时,递归调用table.mapDeep函数处理成员表,
回调函数的参数v为值,k为键,result为当前返回的表
回调函数如果不返回值或返回null时忽略不操作
因此可选通过result修改键值而不是返回新值*/,function(v,k,result){
})
混入表但不覆盖已存在的值,
此函数不复制元表
参数@1为空则创建新表
使用后面的对象补全前面的对象(浅拷贝),并返回该对象
该函数仅修改第一个参数(混入目标),不覆盖已存在的键值.
可用于设置表的默认值
除参数@1,其他任何参数为 null 则停止合并返回结果
创建字符串参数 @1 指定的全局名字空间,
查询或创建名字空间不会触发元方法,
如果名字被非表对象占用导致名称冲突则返回 null,
成功返回该名字空间
此函数的作用与 namespace 语句相同,但不会改变当前名字空间
如果参数不是表则直接返回,
否则将表(table)转换为纯值表。
如果对象定义了 _json 元方法,
则调用该元方法返回值(返回值 2 为 true 时不采用其结果)。
_json 元方法通常会返回纯值或者类纯值类型,但不一定是表对象,
table.parseValue 只会原样返回通过 _json 元方法获取的值,不作其他处理。
纯值表只包含纯值类型数据。
纯值类型指的是字符串、数值、布尔值、buffer、指针、纯值表。
纯值表必须遵守规则如下:
JSON.strip 函数的转换结果也属于纯值
在数组中查找指定值并移除指定值,
此函数无返回值,直接修改参数传入的数组。
在数组中查找指定值,
并移除第一个找到的非null值,
如果移除了元素则返回移除元素的索引,
如果参数@2为null,则清除所有null值。
此函数无返回值。
在数组中查找指定值并将找到的值全部移除,
如果参数@2为 null,则使用 table.range 函数取最大索引,
这会导致最大索引前的所有null值都作为数组元素处理,
建议查看此函数源码以避免错误使用导致性能降低。
此函数无返回值。
调用成员(属性)操作符修改对象的键值。
如果对象实际包含 @member 参数指定键的值则直接修改。
否则调用 _set 元方法修改指定键的值,元方法第 3 个参数(@ownnerAttr)设为 true。
使用索引下标 [] 修改键值触发 _set 元方法时 ownnerAttr 参数为 false 。
参数 @1 指定表内名字空间路径,如果不存在则则创建此表内名字空间,
└── 可用 .
分隔上下级名字空间。
└── 可用下标[]
包含简单表达式,空的[]
表示追加值到数组尾部。
参数 @2 指定需要设置的值,如果不指定则创建空表并赋值,
参数 @3 可选指定一个表对象,默认为 global 全局对象
要注意此函数会触发表的元方法,
而 namespace 语句以及 table.namespace 函数不会触发元方法
对参数中指定的数组原地随机打乱排序,
返回原数组
从指定位置截取并返回新数组,
开始位置可选,默认为1
结束位置可选,默认为数组长度,返回值包含结束位置元素,
如果位置参数为负数,则自右侧反向计算
table.some(/*调用后面的回调函数计算表的任意某个值是否符合条件*/,function(v,k){
})
类似splice函数替换数组片段,
从索引1到最大索引取参数表所有元素插入数组指定位置,
返回包含删除元素的数组
类似splice函数替换数组片段,
从开始到结束索引取出参数表元素插入数组指定位置,
返回包含删除元素的数组
用于检测参数指定的表对象的首选操作类型(preferred type)。
如果参数 @1 不是表(table)则返回 null
,否则返回字符串 "array"
或者 "object"
返回 "array" 则表明表对象可作为伪数组(pseudo-array)
使用 table.len ,table.eachIndex 等函数操作。
函数检测顺序如下:
#
操作符取对象的稠密数组元素个数返回非零值则返回 "array"。从索引1到最大索引返回所有元素值,包含中间的null值