• 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陷阱...

  • 相关阅读:
    svn安装教程
    六、数组类的创建
    五、顺序存储线性表分析
    四、StaticList 和 DynamicList
    三、顺序存储结构的抽象实现
    二、线性表的顺序存储结构
    一、线性表的本质和操作
    专题五:局部变量、全局变量global、导入模块变量
    专题四:文件基础知识、字符编码
    专题3-2:列表基础知识:二维list排序、获取下标和处理txt文本实例
  • 原文地址:https://www.cnblogs.com/drunken-ostrich/p/13048295.html
Copyright © 2020-2023  润新知