Kotlin教程学习-Run,标签Label,函数Function-Type

在Java中可使用{}创建一个匿名的代码块,代码块会被正常的执行,除了改变了做用域以外,彷佛并无什么其余的做用。然而在Kotlin中却不能这么作,这是为何呢?程序员

其实,咱们都知道一个函数必定与一个内存地址相关,而一个匿名的代码块其实也至关因而一个匿名的函数。在Kotlin中通常使用run函数来运行一段匿名代码块。编程

以下:函数

在Kotlin中使用标识符后跟@符号来定义一个标签,使用@后跟标识符来引用一个标签,run函数的语法初看起来似有一些怪异,其实run函数以一个函数做为参数,而一个匿名的代码块就能够是一个匿名函数,当咱们在IntelliJ IDEA中把鼠标光标放到匿名代码块的大括号上时,会显示出匿名代码块对应的函数签名unix

local final fun <anonymous> ():Int defined in com.kotlin_learn.control_flow.fun_run指针

如图:内存

local表明做用域,定义在函数内部,做用域仅为local,final表明不可变,<anonymous>即为匿名,()是参数列表,Int是返回值,com.kotlin_learn.control_flow.fun_run是函数定义位置的完整路径。作用域

因而可知,run函数的参数,那段匿名代码块被编译器转换为了一个匿名函数是毫无疑问的。编译器

固然run函数是能够有返回值的,因此匿名代码块也能够是有返回值的匿名函数。it

每个函数都与一个或多个地址相对应,而每个标签Label也是与一个或多个地址相对应,因此函数自己便是标签。io

因此可使用return@run之类的语法。

匿名函数虽然没有函数名,然而咱们能够定义一个具名标签来表明这个函数,因而可使用return@outer 2将2返回给i。

也许有人会有疑问,为何不直接使用return 2呢,缘由是return 将会从fun_run函数返回,而不是从匿名函数返回。

关于return和函数嵌套定义的问题下面还会说。

这段代码的运行结果以下:


接下来讲一说forEach函数,与其余语言中不一样,在Kotlin中forEach并非一种语法,而是一类函数,forEach是iterator的函数,任何实现了iterator的类均可以使用forEach。forEach函数的参数也是一个函数,其参数是一个模板函数,能够是具名函数,匿名函数,lambda。forEach会对iterator迭代的每个元素都调用一次传入的函数。

之因此讲到forEach,是为了熟悉标签的用法和return的用法。

以下:

别忘了infix function call。

运行结果以下:

接下来讲一说function type,讨论一下函数。

对程序员来讲,函数是很熟悉的,然而咱们对函数就真的那么熟悉么?

函数也能够是类型,能够是变量,甚至常量。

以下:

在这段代码中咱们定义了几个函数类型的变量和常量,而且在之间进行赋值等操做,其实和C++中的函数指针很类似,可是也有独特的地方。好比嵌套函数定义,函数标签的引用以及带标签的返回值等等。咱们也看到了在一个匿名函数(end1表明的那个)中如何使用lambda表达式定义函数的参数列表和自动判断的返回类型。

这段代码运行结果以下:

刚才咱们提到了函数嵌套定义,这是一个须要当心的地方。

看以下的代码:

从Java/C++一系出身的程序员(好比我:))很容易把这里的嵌套函数定义当作是匿名代码块的嵌套,觉得程序会从外往内执行。从Pascal/PL一系出身的程序员就不会有这种问题,千万记住,函数虽然能够嵌套定义,可是若是没有调用是不会从外向内执行的。

因此输出很简单:


咱们也看到了return的用法,这里的f1,f2,f3虽然是内部定义的函数,可是依然能够做为标签使用。

可见Kotlin是一种集大成的语言,甚至借鉴了古老的unix脚本和Pascal的语法,借鉴了不少语言的特性,再加上强大的编译器(Kotlin编译器会帮你作不少东西,远比其余语言作的多得多),使Kotlin的代码很是简洁优雅并且编程至关灵活高效。

在Kotlin中,太多的功能都是经过使用函数做为参数来实现,有的已经不能叫作语法,然而函数嵌套,infix function call,lambda,函数参数,可变参数列表,灵活的标签,强大的return,自动类型判断,Range,iterator,操做符重载,省略,模板...这些太多的功能,致使Kotlin的语法眼花缭乱,虽然有时看起来很优雅,可是也可能给人阅读代码带来巨大的困难。

最后以一段没什么卵用的代码结束本篇。

相关文章
相关标签/搜索