Kotlin,解决调用了函数但是函数体内没有执行的问题,什么时候使用invoke

这篇具有很好参考价值的文章主要介绍了Kotlin,解决调用了函数但是函数体内没有执行的问题,什么时候使用invoke。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

fun main() {
    listOf(1,2,3).forEach{ foo(it)}
}
fun foo(a:Int)= {
    print(a)
}

这段代码按照代码逻辑来说打印的是

123

但是没有这个打印
把foo函数转成java的代码如下

        @JvmStatic
        @NotNull
        public static final Function0 foo(final int var0) {
            return (Function0)(new Function0 () {
                // $FF: synthetic method
                // $FF: bridge method
                public Object invoke() {
                    this.invoke();
                    return Unit.INSTANCE;
                }
                public final void invoke () {
                    int var1 = var0;
                    System.out.print(var1);
                }
            });
        }

Function0表示有0个参数,Function1表示1个参数,以此类推到Function22,超过22可以使用FunctionN表示。
foo函数的返回类型是Function0。这也意味着,如果我们调用了foo(n),那么实质上仅仅是构造了一个Function0对象。这个对象并不等价于我们要调用的过程本身。通过源码可以发现,需要调用Function0的invoke方法才能执行println方法。所以,我们的疑惑也迎刃而解,上述的例子必须如下修改,才能够最终打印出我们想要的结果:

        fun foo(int: Int) = {
            print(int)
        }
        >>> listOf(1, 2, 3).forEach { foo(it).invoke() } // 增加了invoke调用
          123

也可以使用

        >>> listOf(1, 2, 3).forEach { foo(it)() }
        123

造成这个原因,就必须要区分函数、lambda、闭包的区别

函数、Lambda、闭包的区别

❑ fun在没有等号、只有花括号的情况下,是我们最常见的代码块函数体,如果返回非Unit值,必须带return。

fun foo(x: Int) { print(x) }
fun foo(x: Int, y: Int): Int { return x * y }

❑ fun带有等号,是单表达式函数体。该情况下可以省略return

            fun foo(x: Int, y: Int) = x + y

不管是用val还是fun,如果是等号加花括号的语法,那么构建的就是一个Lambda表达式,Lambda的参数在花括号内部声明。所以,如果左侧是fun,那么就是Lambda表达式函数体,也必须通过()或invoke来调用Lambda,如:

        val foo = { x: Int, y: Int -> x + y } // foo.invoke(1, 2)或foo(1, 2)
        fun foo(x: Int) = { y: Int -> x + y } // foo(1).invoke(2)或foo(1)(2)

总结

就是=和{}不能同时使用,如果同时使用则调用的时候需要使用()或者.invoke()才可以正确调用到函数体内的代码。文章来源地址https://www.toymoban.com/news/detail-699803.html

到了这里,关于Kotlin,解决调用了函数但是函数体内没有执行的问题,什么时候使用invoke的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Selenium自动化chrome驱动版本匹配但是调用浏览器失败:Only local connections are allowed. 问题解决

    第一次发现这种情况,驱动版本完全对的上,但是调用 chrome 就提示 Only local connections are allowed. 然后浏览器调用失败报错。 解决方法: 调用 chrome 驱动的时候加个参数 --whitelisted-ips=\\\"\\\" ,值为空就是把所有调入来源都加入白名单。 ips 的全称是 intrusion prevention system ,解释为入

    2024年02月11日
    浏览(40)
  • 「Electron|问题记录」解决应用调用loadURL访问没有ssl证书的http网址连接失败的问题

    本文主要记录在使用electron访问http网址(非https)时,应用窗口不显示网页,命令行提示 handshake failed; returned -1, SSL error code 1, 在electron的入口函数中,创建了一个窗口,然后使用 loadURL 加载一个互联网上的网页,代码如下: 使用 npm start 运行之后,窗口创建完成,但是内容为

    2024年02月16日
    浏览(41)
  • GDB:遇到segfault但是没有core文件如何定位问题

    生产环境定位问题往往遇到各种限制,比如事后日志发现程序是收到SIGSEGV退出了(segment fault),但是因为: 没配置limit 存储空间不够了 其他未知原因 没有正常生成core文件,那么这会如何定位问题呢? 测试程序ctest,明显的空指针错误。 执行后: 但是没有生成core文件。

    2023年04月08日
    浏览(38)
  • Jquery使用ajax的success回调函数不执行,但是能正常请求

            好久没有写代码了,今天使用 jq 的时候发现success回调函数怎么都不执行。         而且令人不解的是,后端居然都成功接收请求,一切正常。 看了网上很多回答,大概有这几点: 将dataType的值从json改为txt 将dataType属性删除 将error的回调函数补上 ... 我都试过了,最

    2024年02月10日
    浏览(40)
  • 解决PyCharm下OpenCV没有自动补全、函数提示的问题!

    最近使用PyCharm编写一段需要使用Opencv库的代码,却发现cv2没有自动补全和函数提示了。博主自己找到以下解决办法,亲测有效!先做如下整理,以供参考! Control + R 打开运行,输入:cmd,调出命令行执行终端,并进入Python环境,执行下面两条指令,找到当前Python环境下的O

    2024年02月04日
    浏览(43)
  • idea中导入maven项目,但是却没有导入依赖的问题

    今天我遇到很奇葩的问题,用maven几年了,只是导入maven项目配置好maven,所有的依赖从仓库下载下来后就自动导入了,前几天电脑硬盘坏了,所以重新装的idea, 可以看到pom的素有依赖都没引入,我重新导入pom还是一样。 这是需要勾选上: 然后再重启idea,再reimport一下就好了

    2024年02月16日
    浏览(49)
  • 登陆校验解决前端success回调函数始终执行问题

    有一串前端js登陆代码: 和后端代码: 存在问题: 不管前端传递的账号密码是否正确,都会成功调用success回调函数,从而导致无法判断账号密码是否匹配成功。 解决办法: 要避免无论账号密码是否正确都调用success回调函数,可以在后端代码中对账号密码进行验证,只有在

    2024年02月14日
    浏览(40)
  • 解决:win10有提示音,但是播视频没有声音

    右下角的声音图标,右键单击,选择\\\"声音”,找到播放,双击负责播放的设备,进入设备属性页,然后取消勾选“启用音频增强”。

    2024年02月12日
    浏览(57)
  • 解决git文件中没有代码改动但是显示一大堆改动

    .git/config 文件用于配置 Git 仓库的行为。 repositoryformatversion : 用途: 指定 Git 仓库的格式版本。 用法: 此配置项的值是整数,指示 Git 仓库的格式版本。一般情况下,你不需要手动更改这个值,Git 会自动管理。 filemode : 用途: 控制是否跟踪文件的执行权限。 用法: 如果

    2024年01月23日
    浏览(45)
  • 下载了nodejs但是npm -v的时候没有反应如何解决

    小伙伴们,我真的别npm搞哭了,昨天折腾俩小时,整半天没出来,今天早上又整了一个多小时才解决,我必须写篇博客记录一下整个安装nodejs的心路历程!!! 说一下我的问题: 安装nodejs就是正常官网Nodejs官网链接安装,一路next傻瓜安装就行,不过你想中途改安装路径也是

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包