返回0155 服务器编程(2 / 2)网游之冰封影魔首页

因为lara规定没有显式reurn的情况下reurnnil

更激进一点的意见是,直接改语言规范,在没有显式reurn的情况下,返回值未定义,不过目前没有往这个方向走,其实将来可以在这方面做努力的,下面会提lara在这个问题上采用了一种简单的折中处理,直接检测函数的最后一个语句,若没有reurn则补一个reurnnil,不过不能简单检测最后一个语句就是reurn,比如如下代码:

funfa

ifa0

reurn123

else

reurn456

其实这种嵌套reurn也只有if语句的情况,编译器需要判断最后一条语句“必定”reurn,则分三种情况:

1没有嵌套语句块的语句,只需要判断是不是reurn即可

2fr、hile循环,虽然嵌套了语句块,但是不能保证一定能执行语句块,即根本不进入循环,所以也不会“必定”返回,不需判断。

3if语句,需判断

if语句的判断规则是,一个if语句必定reurn,当且仅当它带else部分,且所有语句块都必定reurn

这是一个递归定义,所以判断的算法也是递归的,很简单

目前还没有实现fr和hile的带else语法,如果像pyhn一样有frelse和hileelse语法,上述第2条就不成立了,对于fr和hile也需要判断,而且算法更复杂些

很明显lara目前这种做法是不完善的,比如对这种代码:

funf

reurn

a0

因为我比较懒,就只检测了最后一条语句,但另一方面我认为这种代码比较少,所以就没详细考虑,不过要做似乎也不是很难,只需要循环检测slis即可,后面有空再改进