成员操作符

参考:表对象 元表 重载操作符
成员符访问对象的成员.设有下面的table对象:

tab = {
    member = 123;
    count = 20;
}
    

操作符 示例 说明
.
var a = tab.member 成员操作符
[] var a = tab["member"] 下标操作符
[[]] var a = tab[["member"]] 直接下标操作符

获取或设置对象成员,不会调用元方法。
可用此操作符在元方法中避免递归调用元方法。

自以上示例可以看出,以上几种访问对象成员的方法作用类似.都可以存取访问对象的成员.

下标操作符也可以用于字符串、或buffer对象,返回的是指定位置的字节码(数值),例如:
import console;
var str = "test测试"
var wstr = 'Unicode/UTF16宽字符串'u
var buf = raw.buffer("abc测试");
console.log( str[1], wstr[1], buf[1] );
console.pause(
true);

下标用于字符串只能进行只读访问(只能读不能写),
而buffer对象各方面与字符串类似,很多字符串函数都可以兼容buffer对象,
下标的用法跟字符串也类似,但buffer对象的下标操作符是可读可写的(可使用下标修改字节码)


要特别注意的是:

Unicode/UTF16字符串使用下标操作符返回的是宽字节码(2个字节组成的16位数值)。
如果需要返回字符而不是字节码,需要改用直接下标操作符 [[ ]]

比较特殊的是直接下标[[]],这个操作符会禁止aardio调用对象的元方法.
直接下标仅支持table对象、字符串对象,其中字符串为只读访问(只能读取成员,不能写入),使用直接下标访问字符串成员时返回的是字符(字符串对象),而使用普通下标返回的是该字符的字节码(数值对象),示例如下:


  str ="abc"
  
  io.open();
  io.print( str[1] == 'a'# ) //下标越界会返回0
  io.print( str[[1]] == 'a' ) //下标越界会返回null

将直接下标用于没有成员的数据类型,例如数值变量等,直接下标操作符不会象普通成员下标操作符那样抛出运行时异常,而是返回一个null值.使用这个特性,我们可以同时判断一个对象是不是集合对象,并且是否拥有指定的成员.

在win.ui库中有很多的函数,部分参数兼容win.form对象或普通的窗口句柄,这时需要快速的判断对象是不是一个表,是否有hwnd成员,而win.form创建的对象有指定_get元方法,对于不存在的对象不是返回null值,而是返回一个table,这样我们写起来可能非常麻烦,大概要这样写:

hwnd = ( type(arg)==type.table && type(arg.hwnd)==type.number ) ? arg.hwnd : arg

或者写直白一点:

if( type(arg)==type.table && type(arg.hwnd)==type.number ) 
   hwnd = arg.hwnd 
else
   hwnd = arg;

因为arg可能是一个数值,对数值写arg.hwnd会出错,所以要先判断它是不是一个type.table,因为win.form对象还有元方法不存在的对象会返回table,这时后面又要判断它返回的是不是一个数值.

这时候我们可以用直接下标操作符,可以很简单的完成上面的所有事,禁止元方法,检测对象是否一个table,并且是否拥有指定的成员:

hwnd = arg[["hwnd"]]: arg

aardio要求你使用这种麻烦一点的操作符郑重其事地表明:你真的知道这个arg对象可能会是一个数值或什么其他的东西。这不是一个粗心的失误。