因为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即可,后面有空再改进