UnrealScript吐槽系列之一:标识符作为操作符

Unreal Script是整个虚幻引擎的核心,里面有很多很精妙的设计,尤其是在其整体的结构思维上;也有很多脑残的地方,虽然除了一些不常用到的地方发生的暗毛病以外,并没有特别不能忍受的,但作为一个吹毛求疵的伪处女座,如果不能做到有槽必吐逢杠便抬,牙齿难免痒痒。

本来这篇文章打算稍晚一些,在我完整地研究Unreal Script之后再写,但是今天遇到的这个问题,实在觉得是脑残之至,只想说语言的设计者被脑操了,先写出来,等待以后合并。

标识符(identifier)作为操作符(operator)?不知道是否在其他语言中有过先例,不过当我第一次在Unreal Script中看到这种应用时,新鲜之余,觉得这是个蛮不错的主意。比如说下面的代码:

curl = velocity cross force;

计算velocity和force(它们都是vector)的叉积,简单明了。

而且Unreal Script不仅允许重载操作符,还允许自定义新的操作符。比如这个cross操作符就并非(完全是)语言内建的,在object.uc中有定义:

native(220) static final operator(16) vector Cross ( vector A, vector B );

那时候我真心想为这样的设计鼓掌,直到我发现了一件事情:cross并未被声明为保留字,那么,一个变量的名字叫做cross是没有任何问题的。于是,下面的代码开始变得不那么正常了:

local vector cross;
cross = cross cross cross cross cross;

来试试更疯狂一点,别忘了Unreal Script里类名也是可以和变量重名的(尤其是当它不区分大小写时,更是雪上加霜)。先写一个类:

class SB extends Object;

再写一个操作符:

static final operator(16) SB SB(SB a, SB b);

然后,SB的事情开始了:

local SB SB;
SB = SB SB SB SB SB SB SB SB SB;

其实这还没完。考虑下面的代码:

final static preoperator vector myop(out vector operand);
function vector cross(vector param);

--以下代码在其他内--

local vector myop, cross;
cross = myop cross(cross cross cross);

最后这句你能看懂么?myop后面的那个cross,究竟是一个操作符(此时myop是一个vector),还是一个函数调用(此时myop是一个一元操作符)呢?

posted @ 2012-08-22 12:09  hillin  阅读(325)  评论(0编辑  收藏  举报