幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2759|回复: 0

Genie-02-函数、判断、循环和错误处理

[复制链接]

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2010-1-23 14:43:58 | 显示全部楼层 |阅读模式
###函数
定义的方式等和python,ruby,boo差不多的样子。
  1. def add(a:int, b:int):int
  2.     return a+b
  3. init
  4.     print "%d", add(45,55)
复制代码

对于函数的参数来说还有个问题,就是传递的是值还是引用。
可以在参数前加ref关键字来强制使用引用传递。
  1. def change(x:int, ref y:int)
  2.     x = 100
  3.     y = 200
  4. init
  5.     var a = 1
  6.     var b = 2
  7.     
  8.     change(a,ref b)
  9.     print "a:%d\nb:%d", a, b
复制代码
可以看到,a的值还是一开始的1,而b的值就已经被改变了。
另外还有个out,用法和ref差不多,但是out引用的那个变量没有被初始化时,out会帮它初始化,而ref只会报错。
  1. def fn(ref x:int)
  2.     x += 1
  3. init
  4.     z:int
  5.     fn(ref z)
  6.     print ("%d",z)
复制代码
这段用ref就是错误。改成out就可以了。
  1. def fn(out x:int)
  2.     x += 1
  3. init
  4.     z:int
  5.     fn(out z)
  6.     print ("%d",z)
复制代码

###判断语句
if..do..
if..else..
if..else if..else..
简单点的时候,可以利用do写在一行里。
  1. init
  2.     i:int = 3
  3.     if i < 3
  4.         print "i<3"
  5.     else if i == 3
  6.         print "i=3"
  7.     else
  8.         print "i<3"
  9.     
  10.     if i == 3 do print "i=3"
复制代码

case..when..default..
和c中的switch的用法是差不多的。可以把多个条件放在一个when里,是个有趣的功能。
  1. init
  2.     i:int = 3
  3.     case i
  4.         when 0,1,2
  5.             print "i<3"
  6.         when 3
  7.             print "i=3"
  8.         default
  9.             print "i>3"
复制代码

###循环语句
for计数循环
有两种,递增和递减,也可以像if那样利用do写在一行中。
不能自己指定间隔的数值是个遗撼。
  1. init
  2.     for i:int = 1 to 10 do print "%d", i
复制代码
从1开始(包含1)递增1到10(包含10)为止
  1. init
  2.     for i:int = 10 downto 1
  3.         print "%d", i
复制代码
从10开始(包含10)递减1到1(包含1)为止

for..in..
for还可以用于对array,list,dict等类型进行递代器循环,就像c#,d语言的foreach那样。
当然do也还是可以用的。
  1. init
  2.     var d = new dict of string,int
  3.     d.set("a",1)
  4.     d.set("b",2)
  5.     d.set("c",3)
  6.     for n in d.keys
  7.         print "%s:%d", n, d[n]
复制代码
不过0.7.9里,输出的排序有点错位,最后一个排到最前面了。应该是Bug吧。

while..
do..while..
循环,没什么好说的。 和break,continue一起说吧。
break是跳出循环。
continue是回到循环开始处
  1. init
  2.     i:int = 0
  3.     while i < 10
  4.         i++
  5.         if i == 5 do break
  6.         if i == 3 do continue
  7.         print "%d", i
复制代码
  1. init
  2.     i:int = 0
  3.     do
  4.         i++
  5.         if i == 5 do break
  6.         if i == 3 do continue
  7.         print "%d", i
  8.     while i < 10
复制代码

###错误处理
Genie是用的GLib中GError来处理可恢复运行时错误。
assert断言
  1. init
  2.     i:int = 3
  3.     assert i == 3
复制代码
不管断言的内容是否为真,都可以完成编译。
如果为真,程序正常运行,如果为假,则程序运行时报错然后完蛋。

exception定义错误类型信息,与enum用法类似
raises 接在函数定义后面,调用函数时会引起什么类型的错误提示
raise 在适当的时侯抛出错误
try..except..finally..捕获处理错误
  1. exception RPError
  2.     GOOD_PERSION_CARD
  3. def fn() raises RPError
  4.     raise new RPError.GOOD_PERSION_CARD("You are a good person!")
  5. init
  6.     try
  7.         fn()
  8.     except ex:RPError
  9.         print ex.message
  10.     finally
  11.         print "out!"
复制代码

简单的很快就看完了,后面就是难了。唉...
え~え~お!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-4-19 22:10 , Processed in 0.020079 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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