Groovy的Path.traverse()扩展,IntelliJ idea语法错误
Groovy's Path.traverse() extension, IntelliJ idea syntactic error
我正在编辑一个 Groovy (3.0.10) 脚本,我遇到了一个我不理解的语法错误:
当我在 Groovy控制台中尝试这个时,它似乎工作得很好。
为什么 IntelliJ IDEA 会抱怨?这是 IntelliJ IDEA 2022.1.1。
文本中的片段:
final java.nio.file.Path p;
p.traverse(type: FileType.FILES, nameFilter: ~/^\.deployment$/, maxDepth: 1) { final Path dotDeploymentPath ->
println dotDeploymentPath
}
更新 1
当 运行 我们产品中的脚本时,我实际上从 Groovy 得到了同样的错误:
Script4.groovy: 59: [Static type checking] - Cannot call java.nio.file.Path#traverse(java.util.Map <java.lang.String, java.lang.Object>, groovy.lang.Closure) with arguments [java.util.LinkedHashMap <java.lang.String, java.io.Serializable>, groovy.lang.Closure]
@ line 59, column 9.
extensionsPath.traverse(type: FileType.FILES, nameFilter: ~/^\.deployment$/, maxDepth: 1) { final Path dotDeploymentPath ->
^
更新 2
我最终得到了这个,它似乎工作得很好。我仍然不明白为什么 Groovy 不喜欢将选项作为调用的参数。
def final traverseOptions = [type: FileType.FILES, nameFilter: ~/^\.deployment$/, maxDepth: 1] as Map<String, Object>;
extensionsPath.traverse(traverseOptions) { final Path dotDeploymentPath ->
所以我想通了。问题是我在 class 的顶部使用了 @CompileStatic
。我使用 @CompileStatic
是因为我误解了它的作用。我认为这类似于在 Java 中说 static class
。但这不是它的作用。它所做的是,来自 docs:这将使 Groovy 编译器使用 Java 风格的编译时检查,然后执行静态编译,从而绕过Groovy 元对象协议。
(这表明提供独立的测试用例是多么重要。我早该知道的。)
我正在编辑一个 Groovy (3.0.10) 脚本,我遇到了一个我不理解的语法错误:
当我在 Groovy控制台中尝试这个时,它似乎工作得很好。
为什么 IntelliJ IDEA 会抱怨?这是 IntelliJ IDEA 2022.1.1。
文本中的片段:
final java.nio.file.Path p;
p.traverse(type: FileType.FILES, nameFilter: ~/^\.deployment$/, maxDepth: 1) { final Path dotDeploymentPath ->
println dotDeploymentPath
}
更新 1
当 运行 我们产品中的脚本时,我实际上从 Groovy 得到了同样的错误:
Script4.groovy: 59: [Static type checking] - Cannot call java.nio.file.Path#traverse(java.util.Map <java.lang.String, java.lang.Object>, groovy.lang.Closure) with arguments [java.util.LinkedHashMap <java.lang.String, java.io.Serializable>, groovy.lang.Closure]
@ line 59, column 9.
extensionsPath.traverse(type: FileType.FILES, nameFilter: ~/^\.deployment$/, maxDepth: 1) { final Path dotDeploymentPath ->
^
更新 2
我最终得到了这个,它似乎工作得很好。我仍然不明白为什么 Groovy 不喜欢将选项作为调用的参数。
def final traverseOptions = [type: FileType.FILES, nameFilter: ~/^\.deployment$/, maxDepth: 1] as Map<String, Object>;
extensionsPath.traverse(traverseOptions) { final Path dotDeploymentPath ->
所以我想通了。问题是我在 class 的顶部使用了 @CompileStatic
。我使用 @CompileStatic
是因为我误解了它的作用。我认为这类似于在 Java 中说 static class
。但这不是它的作用。它所做的是,来自 docs:这将使 Groovy 编译器使用 Java 风格的编译时检查,然后执行静态编译,从而绕过Groovy 元对象协议。
(这表明提供独立的测试用例是多么重要。我早该知道的。)