0

编辑:它是什么以及它是如何工作的?这是一种 kotlin dsl 语言。

fun ClassName.funcName(): (Type ) -> Type = {func body}

嗯,这是我找到的实现之一,还可以查看此链接的具体语法:https ://dzone.com/articles/the-complete-custom-gradle-plugin-building-tutoria

private fun CodeLinesExtension.buildFileFilter(): 
    (File) -> 
        Boolean = 
            if (fileExtensions.isEmpty()) {
                { true }
            } else {
                { fileExtensions.contains(it.extension) } // filter by extension

            }

如果您将其称为“ .filter(...)”中的参数,“(文件)”语法中会发生什么,它会自动接收参数吗?

someFiles.filter(CodeLinesExtension.buildFileFilter()).forEach{...}
4

1 回答 1

2

这里有很多东西在起作用。

fun SomeClass.funcName()是声明扩展函数的语法。它们的使用与 class 的常规方法一样SomeClass,但可以在 class 之外定义,并且在您无法控制的类上特别有用。

您提到的函数的返回类型是(File) -> Boolean. 这个表达式描述了一个函数类型。在这种特定情况下,所有函数的类型都将 aFile作为单个参数,并返回 a Boolean

这意味着您的buildFileFilter()函数是一个扩展函数,它本身返回一个函数(File) -> Boolean

正如您在函数体中看到的那样,在if语句内部,有大括号来定义if- else( { ... }) 的块,但在这些块内也有大括号。这是因为 Kotlin 对lambda 表达式(匿名函数的文字)使用大括号。

{ true }是一个 lambda 表达式,表示一个函数,该函数可能接受也可能不接受参数,但true每次都返回。

所以这段代码:

if (fileExtensions.isEmpty()) {
    { true }
} else {
    { fileExtensions.contains(it.extension) } // filter by extension
}

返回:

  • { true }- 以 aFile作为参数并始终返回 true 的函数,或
  • { fileExtensions.contains(it.extension) }- 一个以 aFile作为参数并返回是否fileExtensions包含File它接收到的扩展it名的函数(是File参数的隐式名称)

注意:这些函数采用 as 参数的事实File是编译器基于buildFileFilter().

如果您将其称为“.filter(...)”中的参数,“(文件)”语法中会发生什么,它会自动接收参数吗?

filter()它本身实际上需要一个函数作为参数。您传递给的函数filter()称为谓词,因为它将列表中的一个元素作为参数并返回一个Boolean表示该元素是否应包含在结果列表中的值。

因此,如果您应用filtera List<File>,则预期的谓词filter恰好是类型(File) -> Boolean(它表示我们是否应该将此File项目放入结果集合中)。

buildFileFilter()正如我们所见,调用返回一个函数,并且该函数的类型完全适合在filter. File返回的函数的参数buildFileFilter()将由filter函数本身在调用您的过滤器函数时给出。

于 2021-11-12T09:07:04.913 回答