Kotlin &引用;表达式是未使用的";在intellij中使用kotest时

Kotlin &引用;表达式是未使用的";在intellij中使用kotest时,kotlin,intellij-idea,kotest,Kotlin,Intellij Idea,Kotest,使用Kotest编写的这个kotlin测试,IntelliJ显示警告“表达式未使用”,语法着色不起作用。 此外,在运行测试时,找不到该测试 class TalentMatchServiceSpec:StringSpec(){ 初始化{ “将3添加到2应得到5” { //给定整数2和3 val 2=2 瓦尔三=3 //两个数字相加时 瓦尔和=2+3 //那么结果是5 总数应该是5 } } } 只需将开头的花括号放在“3加2等于5”之后,如下所示: class TalentMatchServiceS

使用Kotest编写的这个kotlin测试,IntelliJ显示警告“表达式未使用”,语法着色不起作用。 此外,在运行测试时,找不到该测试

class TalentMatchServiceSpec:StringSpec(){
初始化{
“将3添加到2应得到5”
{
//给定整数2和3
val 2=2
瓦尔三=3
//两个数字相加时
瓦尔和=2+3
//那么结果是5
总数应该是5
}
}
}

只需将开头的花括号放在“3加2等于5”之后,如下所示:

class TalentMatchServiceSpec:StringSpec(){
初始化{
“将3添加到2应得到5”{
//给定整数2和3
val 2=2
瓦尔三=3
//两个数字相加时
瓦尔和=2+3
//那么结果是5
总数应该是5
}
}
}

@Thomas Martin的答案是正确的,但你问为什么会有不同

Kotest中的
SpringSpec
依赖于一些Kotlin DSL特性来工作。让我们从头开始构建相同的函数来进行演示

我们将从使用Kotlin的扩展函数开始。这允许我们向不受控制的类添加函数

所以

因此,我们可以对任何字符串调用此测试函数:

"this is a test".test({ 1 + 2 shouldBe 3 })
其次,Kotlin允许将任何最终lambda arg带到parens之外。所以
foo(arg,arg2,arg3,lambda)
可以变成
foo(arg,arg2,arg3)lambda
。这意味着我们可以将测试编写为:

"this is a test".test { 1 + 2 shouldBe 3 } 
接下来,我们可以将函数标记为中缀,然后不需要使用点来调用它们。因此,我们的测试功能变成:

infix fun String.test(test: () -> Unit)
我们的测试现在看起来像:

"this is a test" test { 1 + 2 shouldBe 3 } 
operator fun String.invoke(test: () -> Unit)
最后,任何名为
invoke
并标记为运算符函数的函数都可以在不使用函数名的情况下调用。因此,类Foo中的
操作符fun invoke(a:String,b:String)
可以作为常规的
Foo.invoke(a,b)
或仅仅
Foo(a,b)
调用

因此,将所有这些放在一起,我们的最终测试函数如下所示:

"this is a test" test { 1 + 2 shouldBe 3 } 
operator fun String.invoke(test: () -> Unit)
我们的测试结果如下:

"this is a test" { 1 + 2 shouldBe 3 }
或者更有可能

"this is a test" { 
  1 + 2 shouldBe 3 
} 

如果大括号移动到下一行,就像在原始问题中一样,它看起来就像一个字符串,后面跟着一个不相关的lambda块。两种不同的表达方式。

你能解释一下为什么会有不同吗?我有点希望其他人诚实。明天我会更努力地去理解为什么。