Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
kotlin是否支持按名称参数?_Kotlin - Fatal编程技术网

kotlin是否支持按名称参数?

kotlin是否支持按名称参数?,kotlin,Kotlin,Scala具有按名称参数支持,其用法如下所示,是否可以在kotlin中实现这一点 def invoke(block: => Boolean) = block // usage var exposure = 0 invoke(exposure == 1) 我在kotlin有以下方法: fun waitFor(condition: () -> Boolean) = condition() // usage var exposure = 0 waitFor { exp

Scala具有按名称参数支持,其用法如下所示,是否可以在kotlin中实现这一点

  def invoke(block: => Boolean) = block

  // usage
  var exposure = 0
  invoke(exposure == 1)
我在kotlin有以下方法:

fun waitFor(condition: () -> Boolean) = condition()

// usage
var exposure = 0
waitFor { exposure == 1 }

waitFor(exposure == 1) // I want its usage to look like this, but it does not compile


waitFor
是我们定制DSL的一部分,它接受一个块,每次调用时都需要对其进行评估。

Kotlin不支持按名称调用,但您可以使用委托属性模拟此功能(有限制),并且这些属性也可以在本地使用

首先考虑Kotlin的懒惰价值。 Kotlin的lazy是通过委托属性实现的。Lazy值在第一次访问它时进行计算,如果您只需要计算一次,它可以作为名称调用使用

val exposure by lazy { 0 }
waitFor(exposure == 1)

您可以实现自定义委托属性,该属性将为您提供几乎与按名称调用相同的语义

fun <T> callByName(block: () -> T) = object: ReadOnlyProperty<Any?, T> {
   override fun getValue(thisRef: Any?, property: KProperty<*>) = block()
}

这在简单的情况下很有用,但在您希望按名称调用整个块的情况下就不行了。

“我们的自定义DSL采用块”
exposure==1
不是块。不要仅仅因为你习惯了另一种语言就与这种语言抗争。使用
waitFor{exposure==1}
你所说的战斗语言是什么意思?这是我问过的一个真正的问题,我想知道在其他一些语言功能中,如操作符重载、调用或带接收器的lambda,这是否可能。我并不是说为什么不支持这一点。我不喜欢这种语法,因为我在另一种语言中使用过它,因为我说过这是我们自定义DSL的一部分,如果我能像在文章中提到的那样编写它,并尽可能采取一些变通方法,DSL看起来会很好。Tim可能的意思是,按名称调用主要是反对Kotlin语言明确性的实用主义。名字让人困惑,我认为自相矛盾的是,它的可读性较差。在我看来,Scala似乎一直在与
{
块开战,这是我无法理解的东西..我完全同意名字让人困惑,我个人不喜欢它.但我被困在一个用例中,我有一个
循环
dsl,它看起来像下面的
循环{waitFor{x==1}…stopWhen(y==5)}
。我想要
waitFor
stopWhen
在语法上看起来很相似。x在这里是一个
var
,可以从其他协程/线程中变异,因此需要在每个固定的轮询间隔进行评估,并且需要是函数。
val exposure by callByName { UUID.randomUUID() }
val alwaysFalse = exposure == exposure
waitFor(exposure == 1)