首页 > 编程语言 > AAuto > 【转自快手论坛】AAuto陷阱
2012
10-27

【转自快手论坛】AAuto陷阱

src:http://www.aau.cn/thread-8056-1-1.html

The best is the enemy of the good!

实际上编程语言很难做到非常的完美,
代码大全上有一句话:编程语言的进步就是不断的增加更多的限制。

例如C,C++就满是各种无尽苦逼的陷阱,也正是这些陷阱让热爱他们的人迷恋其中。
Javascript 也仅仅经过数月的匆忙开发,设计的创促也导致Javascript中存在不少美丽的陷阱。

但是有意思的是:这些充满陷阱和缺陷的语言更加具有实用价值,
而被设计的非常完美的编程语言通常只能被摹拜和赞美 – 实际上有可能很难用!

当然 AAuto 也存在一些各种各样的陷阱,
如果你停止对陷阱 的苛求,尝试换一个优雅的角度去欣赏他,
你将会看到更多美妙的技巧。

import console;

var tab = {}

table.push( tab,tonumber(“1”) );
table.push( tab,
tonumber(“123”) );

console.log(“你觉得tab应当有两个成员吗,下面我们看看tab里面是什么:”)

//tab里面实际有四个元素,超出了我们的预期,这是怎么回事?
console.varDump( tab )

/*
其实原因很简单,
AAuto支持多个返回值,也支持不定参数,
当这个很爽的功能在你没有准备的时候碰到一起,他会搞个恶作剧

tonumber() 转换字符串为数值,
该函数执行成功返回两个值,一个是转换后的数值, 一个是该数字在字符串中的字节长度
例如 tonumber(“123”) 返回 123,3

而 table.push() 函数接受不定个数的参数.
他会 将所有参数添加到数组的尾部.

看:
table.push( tab,tonumber(“123”) );
在执行时就变成了下面这样
table.push( tab,123,3 );
*/


那么如何解决这个问题呢?
很简单, 向下面这样加一对括号就可以,括号建立的表达式只会返回一个值

table.push( tab,( tonumber(“123”) ) );

护短的 return 语句

在AAuto中,
return 语句后面的代码会被解释为注释语句.

这导致两个问题:

1. 可以在return语句后面写出任何没有规则的代码,却又在语法上是被允许的.
这导致IDE在分析代码时很伤神, 例如你的代码折叠失效了,十有八九是你在return语句后面多写了一个大括号什么的.

2. 当return 语句本身写错了时, AAuto会把他解释为 return; 并忽略错误的代码


io.print(
function(){
return (123) )
}
)

复制上面的代码到IDE中,代码可以运行,但是代码折叠消失了。

懒隋的 try catch

AAuto中try catch语句中的return只会退出try catch自身。
需要使用一个额外的错误标记来控制外部函数是否退出。

func = function(){

var err;
try {
error(“出错了”)
return 123;
}
catch( e ){
err = e;
}

if( err ){
return null,err;
}

return 456;
}

的确带来一点小麻烦,但是如果擅于运用,也因此可以写出更简洁优美的代码:

try {

if( 条件1 ){
return;
}

if( 条件2 ){
return;
}

if( 条件3 ){
return;
}

}  


少不了的 win.loopMessage()

在Windows对话框应用程序中,
win.loopMessage() 负责启动消息循环。
消息循环 实际上是一个while循环,他就象公司的前台,不断的接待各种用户操作请求,然后分发给窗体回调函数。

在 AAuto 中开发对话框应用程序非常简单,你都不需要显示的指定应用程序主窗体。
当所有窗口退出,会自动退出  win.loopMessage() , 这些会自动的帮你处理的妥妥当当。

但是这又导致了一个新的问题。
我们看下面的代码。

import win.ui;
/*DSG{{*/
var winform = ..win.form( scroll=1;bottom=399;parent=…;text=“AAuto Form”;right=599 )
winform.add(  )
/*}}*/

winform.show() //显示窗体
winform.close() //关闭窗体

/*
所有窗体退出了, 看起来消息循环也不需要了?
win.loopMessage() 看来也可以省略掉了!?
*/

//下面我们制造一个程序异常,理论上我们应当看到IDE弹出错误信息
error(“出错”)


怎么回事?

我们并没有看到错误信息 !
也就是说这后面的代码要是出错了,我们将看不到任何提示.

呃,窗口程序的机制可不是想象的那么简单。
win.loopMessage() 还做了很多其他的事,例如在所有窗口退出以后,负责打扫卫生 – 灭掉所有的 _WM_QUIT 退出消息。

解决办法是加上 win.loopMessage()
你完全不用担心他会启动一个新的循环,他很聪明,如果发现你创建的窗体都关闭了,他会在收到 _WM_QUIT  时退出。
如果你忘记了这件事,那这些到处乱跑的 _WM_QUIT 会“帮助”你关掉你的错误对话框。

正确代码如下:

import win.ui;
/*DSG{{*/
var winform = ..win.form( scroll=1;bottom=399;parent=…;text=“AAuto Form”;right=599 )
winform.add(  )
/*}}*/

winform.show()
winform.close()

win.loopMessage() //I’m back 

error(“出错”)

最后编辑:
作者:NINE
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。