修改表调用方式

admin2021-01-15  2.0K+

import console;
 
/*
Javascript Array 可以直接调用方法 eg: [1,2,3].map(...)
table 每次都要  table.map(t, ...), 那么如何才能像js一样通过 t.map(...)调用呢?

元表(metatable)允许我们改变表(table)的行为, 可以通过 t@ = {_get = table}
给表 t 指定元表为 table库, 这样就可以通过 t.map(t,...) 调用了。
可是这里每次都还要输入 t 参数感觉怪怪的 2333,  
下面通过 table.map 给 table库每个函数绑定 owner 参数,
并返回一个新的表作为元表!

注意:
这里只是绑定了第一参数是表的函数,
对于table库其他第一参数不是表自身的函数不起作用。
*/

meta = function(t, add = true){
	t@ = add ? {
		_get = table.map(table, function(v){
			return lambda(...) v(owner,...)
		});
		_float = true; //允许移除元表	
	} : null
	return t; 
}

// 添加元表
var t =  meta({1,2,3,4,5}); 

// 测试代码
console.varDump( t.filter( lambda(v) v>2 ) ) 
console.varDump( t.find(3) )
console.varDump( t.map( math.sqrt ) )
console.varDump( t.pop() )

// 移除元表
meta(t,false)
console.pause(true);
转载请注明原文地址: https://aardio.net/read-129.html

最新回复(0)
源码分享
aardio源码分享