搜索
查看: 12258|回复: 25

aardio 陷阱

    [复制链接]

30

主题

695

帖子

4178

积分

超级版主

Rank: 8Rank: 8

积分
4178
发表于 2012-9-6 16:27:33 | 显示全部楼层 |阅读模式
The best is the enemy of the good!

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

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

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

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

下面每一个回复贴将向大家介绍一个aardio陷阱,
也欢迎大家回贴参与 - 发表你发现的陷阱, 其他内容请大家使用“点评”功能发表。
回复

使用道具 举报

30

主题

695

帖子

4178

积分

超级版主

Rank: 8Rank: 8

积分
4178
 楼主| 发表于 2012-9-6 16:38:40 | 显示全部楼层
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") ) );  


评分

参与人数 4银币 +75 收起 理由
air_fans + 10 赞一个!
GuKaKa + 10 很给力!
橘子皮 + 5 很给力!
aaucn + 50

查看全部评分

回复

使用道具 举报

30

主题

695

帖子

4178

积分

超级版主

Rank: 8Rank: 8

积分
4178
 楼主| 发表于 2012-9-6 16:47:09 | 显示全部楼层
在aardio中,
return 语句后面的代码会被解释为注释语句.

这导致两个问题:

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

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

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

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


评分

参与人数 3银币 +62 收起 理由
cdaz11 + 2 IDE经常出现敲一个回车键,代码区的滚动条.
air_fans + 10 确实碰到过
aaucn + 50

查看全部评分

回复

使用道具 举报

30

主题

695

帖子

4178

积分

超级版主

Rank: 8Rank: 8

积分
4178
 楼主| 发表于 2012-9-6 16:57:54 | 显示全部楼层
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;
    }
   
   
return 456;
}


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

try {

   
if( 条件1 ){
        
return;
    }
   
   
if( 条件2 ){
        
return;
    }
   
   
if( 条件3 ){
        
return;
    }  
   
}
  

所以任何特性你用不好就是陷阱,用好了就可以发挥他的长处。

评分

参与人数 2银币 +100 收起 理由
搞起 + 50
aaucn + 50

查看全部评分

回复

使用道具 举报

30

主题

695

帖子

4178

积分

超级版主

Rank: 8Rank: 8

积分
4178
 楼主| 发表于 2012-9-7 13:29:21 | 显示全部楼层
在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("出错")

  



评分

参与人数 2银币 +55 收起 理由
aaucn + 50
xowan + 5 解释的很到位

查看全部评分

回复

使用道具 举报

0

主题

17

帖子

92

积分

一级会员

Rank: 2

积分
92
发表于 2012-10-27 16:44:30 | 显示全部楼层

学习了。

学习了。
回复

使用道具 举报

9

主题

49

帖子

1万

积分

九级会员

Rank: 12Rank: 12Rank: 12

积分
17754
发表于 2012-10-27 18:19:07 | 显示全部楼层

很有收货

很有收货
回复

使用道具 举报

8

主题

125

帖子

848

积分

三级会员

Rank: 4

积分
848
发表于 2012-10-30 09:07:43 | 显示全部楼层

经典的解释

经典的解释
回复

使用道具 举报

0

主题

42

帖子

363

积分

二级会员

Rank: 3Rank: 3

积分
363
发表于 2012-10-31 14:07:05 | 显示全部楼层

收货不少

收货不少
回复

使用道具 举报

39

主题

195

帖子

1269

积分

四级会员

Rank: 6Rank: 6

积分
1269
发表于 2012-11-8 21:32:17 | 显示全部楼层

正在阅读,先回复

正在阅读,先回复
回复

使用道具 举报

3

主题

22

帖子

212

积分

二级会员

Rank: 3Rank: 3

积分
212
发表于 2012-11-26 17:03:04 | 显示全部楼层

{:3_59:}怎么没有顶的表情。。。

怎么没有顶的表情。。。
回复

使用道具 举报

7

主题

76

帖子

493

积分

二级会员

Rank: 3Rank: 3

积分
493
发表于 2012-11-26 22:10:39 | 显示全部楼层
quicker 发表于 2012-9-6 16:38
import console;

var tab = {}


我一般都是tonumber的值返回给某个变量,然后再push进table的。
回复

使用道具 举报

15

主题

132

帖子

937

积分

三级会员

Rank: 4

积分
937
发表于 2012-11-27 04:44:46 | 显示全部楼层

感谢楼主的分享!{:handshake:}

感谢楼主的分享!
回复

使用道具 举报

1

主题

12

帖子

73

积分

一级会员

Rank: 2

积分
73
发表于 2012-11-27 17:49:48 | 显示全部楼层

天天学习!

天天学习!
回复

使用道具 举报

4

主题

14

帖子

102

积分

一级会员

Rank: 2

积分
102
QQ
发表于 2012-11-28 10:03:20 | 显示全部楼层

学习了

学习了
回复

使用道具 举报

0

主题

13

帖子

74

积分

一级会员

Rank: 2

积分
74
发表于 2012-11-29 23:50:30 | 显示全部楼层

学习了

学习了
回复

使用道具 举报

0

主题

21

帖子

151

积分

一级会员

Rank: 2

积分
151
发表于 2012-12-23 13:42:26 | 显示全部楼层

学习学习!!!!!!!!!!!!!!111111

    学习学习!!!!!!!!!!!!!!111111
回复

使用道具 举报

0

主题

10

帖子

72

积分

一级会员

Rank: 2

积分
72
发表于 2013-3-6 16:30:06 | 显示全部楼层

收获不是一点点。谢了。

收获不是一点点。谢了。
回复

使用道具 举报

0

主题

24

帖子

221

积分

二级会员

Rank: 3Rank: 3

积分
221
发表于 2013-5-13 14:25:57 | 显示全部楼层

很多年使用经验的总结,去芜存菁

很多年使用经验的总结,去芜存菁
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-21 03:11 , Processed in 0.140625 second(s), 29 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表