Genie-02-函数、判断、循环和错误处理
###函数定义的方式等和python,ruby,boo差不多的样子。
def add(a:int, b:int):int
return a+b
init
print "%d", add(45,55)
对于函数的参数来说还有个问题,就是传递的是值还是引用。
可以在参数前加ref关键字来强制使用引用传递。
def change(x:int, ref y:int)
x = 100
y = 200
init
var a = 1
var b = 2
change(a,ref b)
print "a:%d\nb:%d", a, b
可以看到,a的值还是一开始的1,而b的值就已经被改变了。
另外还有个out,用法和ref差不多,但是out引用的那个变量没有被初始化时,out会帮它初始化,而ref只会报错。
def fn(ref x:int)
x += 1
init
z:int
fn(ref z)
print ("%d",z)
这段用ref就是错误。改成out就可以了。
def fn(out x:int)
x += 1
init
z:int
fn(out z)
print ("%d",z)
###判断语句
if..do..
if..else..
if..else if..else..
简单点的时候,可以利用do写在一行里。
init
i:int = 3
if i < 3
print "i<3"
else if i == 3
print "i=3"
else
print "i<3"
if i == 3 do print "i=3"
case..when..default..
和c中的switch的用法是差不多的。可以把多个条件放在一个when里,是个有趣的功能。
init
i:int = 3
case i
when 0,1,2
print "i<3"
when 3
print "i=3"
default
print "i>3"
###循环语句
for计数循环
有两种,递增和递减,也可以像if那样利用do写在一行中。
不能自己指定间隔的数值是个遗撼。
init
for i:int = 1 to 10 do print "%d", i
从1开始(包含1)递增1到10(包含10)为止
init
for i:int = 10 downto 1
print "%d", i
从10开始(包含10)递减1到1(包含1)为止
for..in..
for还可以用于对array,list,dict等类型进行递代器循环,就像c#,d语言的foreach那样。
当然do也还是可以用的。
init
var d = new dict of string,int
d.set("a",1)
d.set("b",2)
d.set("c",3)
for n in d.keys
print "%s:%d", n, d
不过0.7.9里,输出的排序有点错位,最后一个排到最前面了。应该是Bug吧。
while..
do..while..
循环,没什么好说的。 和break,continue一起说吧。
break是跳出循环。
continue是回到循环开始处
init
i:int = 0
while i < 10
i++
if i == 5 do break
if i == 3 do continue
print "%d", i
init
i:int = 0
do
i++
if i == 5 do break
if i == 3 do continue
print "%d", i
while i < 10
###错误处理
Genie是用的GLib中GError来处理可恢复运行时错误。
assert断言
init
i:int = 3
assert i == 3
不管断言的内容是否为真,都可以完成编译。
如果为真,程序正常运行,如果为假,则程序运行时报错然后完蛋。
exception定义错误类型信息,与enum用法类似
raises 接在函数定义后面,调用函数时会引起什么类型的错误提示
raise 在适当的时侯抛出错误
try..except..finally..捕获处理错误
exception RPError
GOOD_PERSION_CARD
def fn() raises RPError
raise new RPError.GOOD_PERSION_CARD("You are a good person!")
init
try
fn()
except ex:RPError
print ex.message
finally
print "out!"
简单的很快就看完了,后面就是难了。唉...
页:
[1]