当前位置: 首页 > 知识库问答 >
问题:

在Kotlin中使用和运行的区别

巫马俊力
2023-03-14

withrun是否具有相同的功能,只是语法不同,或者withrun之间是否存在重大差异?

哪一种是正确的方法?

adapter.run {
    notifyDataSetChanged()
    if (activityDetails.isEmpty())
        emptyText.visibility = View.VISIBLE
    else 
       emptyText.visibility = View.GONE
}


with(adapter){
   notifyDataSetChanged()
   if (activityDetails.isEmpty())
       emptyText.visibility = View.VISIBLE
   else 
       emptyText.visibility = View.GONE
}

共有2个答案

祁兴运
2023-03-14

在正常情况下,它们非常相似,但是对于一个可为空的变量,最好使用T. run()

例如,如果webview.settings为空,下面将显示不同的

with(webview.settings) {
    this?.javaScriptEnabled = true
    this?.databaseEnabled = true
}

// similarly
webview.settings?.run {
    javaScriptEnabled = true
    databaseEnabled = true
}
韩烈
2023-03-14

它们只有语法上的区别,run是一个扩展函数,而with不是。以下是定义(在kotlin sdlib:1.0.3中):

public inline fun <T, R> T.run(block: T.() -> R): R = block() // equivalent to this.block()

public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

由于run是一个扩展函数,它还有一个类型为T的隐式参数,因此参数类型相同。职能机构实际上也是相同的。

它们的性能也应该是等价的,因为两者都是内联函数:生成的字节码应该只包含内联的块正文。

函数使用上的差异都是由于run是一个扩展。

首先,run适用于调用链接:

foo.run { bar }.run { baz }

其次,更重要的是,如果声明的变量类型具有具有相同签名的run函数,则将调用它而不是扩展名。而run可以被另一个扩展隐藏。这就是扩展的解析方式。例子:

class MyClass {
     fun <R> run(blockIgnored: MyClass.() -> R): Nothing = throw RuntimeException()
}

"abcdefg".run { println("x") } // prints "x"
MyClass().run { println("x") } // throws RuntimeException
(MyClass() as Any).run { println("x") } // prints "x"
 类似资料:
  • 我在Grizzly服务器上为Jersey应用程序运行以下简单示例: 当我从IntelliJ运行它时,一切都按照预期工作。 已连接到目标VM,地址:“127.0.0.1:61163”,传输:“Socket”2016年12月30日4:00:07PM com.sun.jersey.api.core.PackagesResourceConfig init信息:在包中扫描根资源和提供程序类:Applicat

  • 我想了解这两种说法在更深层次上的区别是什么。 即使我能够从其他类中访问这些变量,并且对我来说两者的工作方式相同,但是< code>get()又有什么不同呢?

  • https://i.stack.imgur.com/tE6Rq.png 我是科特林的新手。这是我的第一个项目,我有问题。我不知道现在该怎么办。如果有人能解决这个问题,对我真的很有帮助。提前谢谢。请看附件中的照片

  • 我不想在这里使用maven或gradle。我知道gradle可以帮我解决依赖关系。我只想要一个普通的香草Kotlin你好世界项目。文档中有一个“IntelliJ理念入门”部分,其中只提到了IntelliJ的Kotlin插件。似乎没有安装gradle或maven的要求,插件应该可以做到这一点。我知道您可以使用手动安装SDK,但文档是错误的,并且仅此插件无法在之前手动安装SDK或使用Maven/Gra

  • 我对Kotlin中的两个函数和感到非常困惑,有人能给我一个具体的例子来区分这两个函数吗?

  • 我有这个命令来编译我的程序。 我创建了以下makefile。 如果从terminal运行该命令将成功,但make将失败。 它将失败,并出现错误 该文件应该在命令中使用导入。 我认为Makefile中的命令执行起来很像bash脚本。 在bash中运行命令和在Makefile中运行命令有什么区别?