aardio陷阱(转)
一、tonumber()函数 转换字符串有2个返回值
import console;
var tab = {}
table.push( tab,tonumber("1") );
table.push( tab,tonumber("123") );
console.log("你觉得tab应当有两个成员吗,下面我们看看tab里面是什么:")
//tab里面实际有四个元素,超出了我们的预期,这是怎么回事?
console.varDump( tab )
/*
其实原因很简单,
aardio支持多个返回值,也支持不定参数,
当这个很爽的功能在你没有准备的时候碰到一起,他会搞个恶作剧
tonumber() 转换字符串为数值,
该函数执行成功返回两个值,一个是转换后的数值, 一个是该数字在字符串中的字节长度
例如 tonumber("123") 返回 123,3
而 table.push() 函数接受不定个数的参数.
他会 将所有参数添加到数组的尾部.
看:
table.push( tab,tonumber("123") );
在执行时就变成了下面这样
table.push( tab,123,3 );
*/
那么如何解决这个问题呢?
很简单, 向下面这样加一对括号就可以,括号建立的表达式只会返回一个值
table.push( tab,( tonumber("123") ) );
二、return 语句后面的代码会被解释为注释语句.
这导致两个问题:
-
可以在return语句后面写出任何没有规则的代码,却又在语法上是被允许的.
这导致IDE在分析代码时很伤神, 例如你的代码折叠失效了,十有八九是你在return语句后面多写了一个大括号什么的. -
当return 语句本身写错了时, aardio会把他解释为 return; 并忽略错误的代码
import console;
var func = function(){
return (123))))).*&^%iaar.cc
}
console.log(func())
console.pause(true);
很明显的错误写法,但代码可以正常运行。
三、try catch语句中的return只会退出try catch自身。
aardio中try catch语句中的return只会退出try catch自身。
而且也只能用return退出try catch语句( 不能使用 break continue 语句 )。
如果需要在退出try catch语句后退出函数,
那么需要在try catch语句中使用一个额外的错误标记,然后在try catch语句结束后检查该标记并退出函数。
func = function(){
var err;
try {
error("出错了")
return 123;
}
catch( e ){
err = e;
}
if( err ){
return null,err;
}
这的确带来一点小麻烦,但是如果擅于运用,也因此可以写出更简洁优美的代码:
try {
if( 条件1 ){
return;
}
if( 条件2 ){
return;
}
if( 条件3 ){
return;
}
}
所以任何特性你用不好就是陷阱,用好了就可以发挥他的长处。
四、在Windows对话框应用程序中,win.loopMessage() 负责启动消息循环。
消息循环 实际上是一个while循环,他就象公司的前台,不断的接待各种用户操作请求,然后分发给窗体回调函数。
在 aardio 中开发对话框应用程序非常简单,你都不需要显示的指定应用程序主窗体。
当所有窗口退出,会自动退出 win.loopMessage() , 这些会自动的帮你处理的妥妥当当。
但是这又导致了一个新的问题。
我们看下面的代码。
import win.ui;
/*DSG{{*/
var winform = ..win.form( scroll=1;bottom=399;parent=...;text="aardio 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="aardio Form";right=599 )
winform.add( )
/*}}*/
winform.show()
winform.close()
win.loopMessage() //I'm back
error("出错")
以上摘自:http://bbs.aardio.com/forum.php?mod=viewthread&tid=8056