
上QQ阅读APP看书,第一时间看更新
3.1.5 带有块体的函数
当函数很小,只是单表达式时,可以使用=运算符将函数体与声明分开。如果函数比这个更复杂,那么将主体放在块{}中,不要使用=。你必须为带有块体的任何函数指定返回类型,否则,返回类型将推断为Unit。
让我们编写一个函数,它返回给定数组中数字的最大值。

max()函数接受一个数组作为参数,将Int指定为返回类型,并将函数体包装在块{}中。在这种情况下,返回类型是不可选的——你必须指定它,因为函数的主体是一个块。另外,return关键字也是必需的。
需要注意的一点是,不要使用后面跟着块体{}的=。如果显式地指定返回类型,并在其后面加上=,然后是块体,编译器将会报错。
如果省略了返回类型,但使用了=,然后是一个块体而不是单表达式,那么会怎么样呢?例如,如果我们编写一些如下的内容会怎么样呢?

Kotlin不会通过进入代码块来推断返回类型。但是,它将假设整个块是一个lambda表达式或一个匿名函数——这是本书稍后将讨论的主题。Kotlin认为notReally()是一个返回lambda表达式的函数。
为了好玩(诚然,这是对好玩的一种有偏差的定义),让我们探讨一下使用带有块的=的效果,但是没有返回类型。


推断函数f1()返回一个Int。但是Kotlin推断f2()函数返回的是一个lambda表达式,它不接受任何参数并返回一个Int,同样,它推断f3()函数返回的是一个lambda表达式,它接受Int并返回Int。
编写这种代码的人不太可能有很多朋友——没必要编写这样的代码,然后独自度过余生。如果您想创建返回lambda的函数,我们稍后将看到更好的方法。简而言之,不要将=与块体混用。
你知道了如何创建函数,下面让我们看看如何在Kotlin中轻松地演化现有的函数。