0

我正在尝试在 grails 控制器中迭代参数列表。当我有一个比一个元素长的列表时,如下所示:

     [D4L2DYJlSw, 8OXQWKDDvX]

以下代码工作正常:

def recipientId = params.email
recipientId.each { test->
     System.print(test + "\n")  
}

输出为:

  A4L2DYJlSw
  8OXQWKDDvX

但是,如果列表只有一个项目,则输出不是唯一的项目,而是列表中的每个字母。例如,如果我的参数列表是:

 A4L2DYJlSwD

使用与上面相同的代码,输出变为:

 A
 4
 L
 2
 D
 Y
 J
 l
 S
 w

谁能告诉我发生了什么以及我做错了什么?

谢谢

杰森

4

4 回答 4

1

不久前我遇到了同样的问题!我的解决方案是

def gameId = params.gameId
def selectedGameList = gameId.class.isArray() ? Game.getAll(gameId as List) : Game.get(gameId);

因为在我的情况下,我得到了 1 个或多个游戏 ID 作为参数!

你可以做的是相同的:

def recipientId = params.email
if(recipientId.class.isArray()){
 // smtg
}else{
  // smtg
}

因为这里发生的事情是,只要您调用 '.each' groovy 就会将该对象转换为列表!而 groovy 中的 'String AS LIST' 表示该字符串的 char_array !

于 2011-09-09T20:52:38.953 回答
0

我的猜测是(从我在其他地方看到的 groovy )是它试图找出类型recipientId应该是什么,因为你没有给它一个(因此它是动态的)。

在您的第一个示例中,groovy 决定传递给.each{}闭包的是List<String>. 第二个例子,因为只有一个String,groovy 决定类型应该是String并且.each{}知道如何迭代 a String——它只是将它转换为 a char[]

在这种情况下,你可以简单地做recipientId一个List<String>我认为。

于 2011-09-09T20:24:03.673 回答
0

你也可以这样尝试:

def recipientId = params.email instanceof List ? params.email : [params.email]
recipientId.each { test-> System.print(test + "\n") }

它将处理这两种情况..

于 2011-09-10T04:43:38.747 回答
0

Grails 提供了一种内置方法来保证特定参数是一个列表,即使只提交了一个。当项目数可能为 0、1 或更多时,这实际上是获取项目列表的首选方式:

def recipientId = params.list("email")
recipientId.each { test->
     System.print(test + "\n")  
}

params对象会将单个项目包装为一个列表,如果有多个,则返回该列表。

于 2011-09-11T08:20:18.277 回答