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 语句后面的代码会被解释为注释语句.

这导致两个问题:

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

  2. 当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

欢迎补充你发现的aardio陷阱...

posted @ 2020-06-05 10:35  酒醉的鸵鸟  阅读(962)  评论(0编辑  收藏  举报