我有一个类似的枚举:
object ContentType extends Enumeration {
type ContentType = Value
val BlogPost, KB, Link = Value
}
现在我想使用此枚举创建一个下拉列表。
@helper.select(field = ContentForm("contentType"), options = @contentTypes)
Play有@helper.select
方法,需要一个序列,所以我添加了一个序列,我将传递给我的视图页面:
val contentTypes: Seq[(Int, String)] = ...
如何从ContentType枚举初始化或创建此序列?
更新
抱歉,它必须是Seq [(String,String)]
类型答案 0 :(得分:5)
我不清楚为什么val contentTypes
类型为Seq[(Int, String)]
,也许我错过了某些内容,但您可以将Enumeration
转换为{{ 1}}所以:
Seq
编辑:
从@Marth评论,使用scala> object ContentType extends Enumeration {
| type ContentType = Value
| val BlogPost, KB, Link = Value
| }
defined module ContentType
scala> ContentType.values.toSeq
res0: Seq[ContentType.Value] = ArrayBuffer(BlogPost, KB, Link)
和zipWithIndex
:
swap
如果您需要scala> ContentType.values.toSeq.map(_.toString).zipWithIndex.map(_.swap)
res5: Seq[(Int, String)] = ArrayBuffer((0,BlogPost), (1,KB), (2,Link))
:
Seq[(String, String)]
一步一步:
scala> ContentType.values.toSeq.map(_.toString).zipWithIndex.map(tuple => (tuple._2.toString, tuple._1))
res6: Seq[(String, String)] = ArrayBuffer((0,BlogPost), (1,KB), (2,Link))
返回ContentType.values.toSeq
,然后调用Seq[ContentType.Value]
返回.map(_.toString)
,您现在希望每个Seq[String]
都与数字标识符相关联,我们使用每个值的索引,String
创建zipWithIndex
个元组,其中第一个值为Seq
,第二个值为String所在的索引:
String
我们就在那里,所需的类型是scala> ContentType.values.toSeq.map(_.toString).zipWithIndex
res7: Seq[(String, Int)] = ArrayBuffer((BlogPost,0), (KB,1), (Link,2)
我们有一个Seq[(String, String)]
,另请注意,我认为您希望元组属于Seq[(String, Int)]
,而我们现在有(index, value)
,所以我们再次映射有两个原因,第一个是交换值,第二个是将索引转换为字符串:
(value, index)
我们还可以缩短删除第一个地图的代码,该地图将我们的自定义类型转换为字符串并延迟上一个地图中的scala> ContentType.values.toSeq.map(_.toString).zipWithIndex.map(tuple => (tuple._2.toString, tuple._1))
res8: Seq[(String, String)] = ArrayBuffer((0,BlogPost), (1,KB), (2,Link))
调用,具有以下内容:
toString