Kotlin 关于 @ 符号和返回后缀的澄清

API*_*024 5 kotlin

我对下一个语法的含义用法感到困惑。

  1. 在“返回”之后放置后缀“async”和“lazy”究竟有什么作用?

    return async
    
    return lazy
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这里的“@”符号是什么意思?

    return@async
    
    return@lazy
    
    return@withContext 
    
    Run Code Online (Sandbox Code Playgroud)

关于“@”符号,它在 Kotlin 中有特殊的命名吗?所以我可以更好地在文档中找到所有使用它的方法?

添加@ 和不使用它有什么区别?所以:

"return async" vs "return@async"
Run Code Online (Sandbox Code Playgroud)

Jof*_*rey 4

  1. 在“return”之后放置后缀“async”和“lazy”到底有什么作用?

并不是Kotlin 中带有特定单词“异步”或“惰性”的特殊语法。所以它并不是真正的“关键字后缀return”。在空格之后,return后面的始终是您想要返回的值:

  • return 42返回值 42
  • return async返回表达式的值async(可能是之前在代码中声明的变量)
  • return async { 42 }返回表达式的值async { 42 }

这里表达的意思与本身async { 42 }无关。return您可以看到分配给变量的相同表达式,例如:val deferred = async { 42 }async只是 kotlinx.coroutines 库中的一个库函数(顺便说一句,这只是我的猜测,也许您看到的代码声明了该名称的变量/函数,但如果没有更多上下文,很难判断)。如果您有兴趣,请查看此处该函数的文档。async

  1. 这里的“@”符号是什么意思?

默认情况下,关键字return从使用该fun关键字声明的最接近的封闭函数返回。Lambda 不算数,因为它们不是用 声明的fun

因此,return默认情况下(不带 ),从 lambda 内部返回的 -ing 将从@封闭函数返回,而不仅仅是“本地”lambda(与 Java 中发生的情况相反)。这就是为什么我们称它们为非本地返回

使用带有标签( ) 的限定返回值可以更改此默认行为并明确指定要从中返回的内容。请参阅有关return at labels的文档,它包含许多示例。return@label

您给出的具体例子:

return@async
return@lazy
return@withContext 
Run Code Online (Sandbox Code Playgroud)

需要更多背景知识才能理解它们。但我假设您已经看到它们在作为async函数lazy调用参数的 lambda 内部使用withContext。这里后面的内容@称为隐式标签,它告诉编译器return应该从该 lambda 返回而不是从最接近的封闭返回fun

其他注意事项

请注意,@此处的符号不是像您在其他地方看到的注释@JvmDefault(如或 )@OptIn(...),而是标签引用。

请注意,标签和返回值都可以组合:return@myLabel 42从由标签限定的函数返回值 42 myLabel