【问题标题】:groovy what's wrong with this basic closure?groovy 这个基本的闭包有什么问题?
【发布时间】:2011-11-15 17:42:11
【问题描述】:

我有以下 groovy 代码:

dataFile.filterLine() {it =~ /(${searchStr1}|${searchStr2})/ }.each { it ->
    println it
    it.split { list ->
        println "split line:  ${list[0]},  ...."
    }
}

第一个 println 效果很好——列出了所有匹配的行。然后,拆分会导致错误,实际上是在第二个 println 上。显然它不喜欢 ${list[0]}。但是,我不清楚这有什么问题。

错误是:

No signature of method: org.codehaus.groovy.runtime.DefaultGroovyMethods$4.getAt() is applicable for argument types: (java.lang.Integer) values: [0]
Possible solutions: getAt(java.lang.String), putAt(java.lang.String, java.lang.Object), wait(), grep(), getClass(), wait(long). Stacktrace follows:

谢谢

【问题讨论】:

  • 你要拆分的是什么类型的?
  • 不确定“.each”会产生什么,一个列表?我在第一个 println 上方添加了一个 println "class is: ${it.getClass()}",它产生了:class is: class org.codehaus.groovy.runtime.DefaultGroovyMethods$4
  • ...顺便说一句,我并没有坚持在这里关闭。我只是不想从文件中拆分出我想要的行。

标签: groovy


【解决方案1】:

filterLine 不会返回您认为的结果;这是一个Writable,包含输入文件中的所有匹配项。

这是一个最小的例子:

f = new File("/home/dave/.bashrc")
w = f.filterLine({ it =~ /alias/ })
println w.class

s = w.toString()
println s

s.eachLine { println "==> ${it}" }

【讨论】:

  • 感谢戴夫指出这一点,你是对的(这行得通)。 Groovy 中必须有一种更优雅的方式来过滤文件中的一行,并将其拆分为多个部分......想法?我应该发布第二个问题吗?
  • 感谢您的帮助 Dave,我还发布了一个一般性问题。
【解决方案2】:

String.split() 不接受闭包参数。我想你可能想要it.split().each { list -> 作为第三行。

编辑:它实际上匹配Collection.split(Closure),其中闭包用于对内容进行分组。

【讨论】:

  • 谢谢(缺少闭包参数是有道理的,添加 .each 很有趣!)。我认为你的意思是“it.split().each { line ->”,即“->”之前的“line”。我这样试了,还是报ERROR errors.GrailsExceptionResolver - NullPointerException
  • Ataylor,如果我试图从文件中拆分一行的方式是“糟糕”的编程,请也提出建议。任何好的方法都会奏效:-)
  • 我将我的“println it”澄清为“println”LINE: ${it}”,看起来“it”是一长行,所有匹配的文件行都用回车添加(所以它愚弄了我)。
  • @Ray,你是对的,修复了line -> 行。但是假设 split 应该将行拆分为单词(或行),您需要 no-arg 或 String arg String 拆分,而不是 Closure arg Collection 拆分。
  • 不确定我是否理解@Ataylor。我将发布一个关于这个问题的一般性问题,因为我认为它作为一般性问题会更有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多