gpt4 book ai didi

scala - 如何从其他包中引用 scala 枚举

转载 作者:行者123 更新时间:2023-12-01 09:04:41 26 4
gpt4 key购买 nike

我无法理解为什么我不能引用 scala 枚举类型。

问题是有时我可以引用枚举:

enum(UserStatus)

有时它提示无法找到枚举
not found: type UserStatus

为什么我有时不能引用 Enumeration 类?

枚举的生成源似乎没问题,并且它与我拥有的另一个枚举一起工作得很好,它住在同一个地方,同样的用法......

有什么建议么?

更多信息

枚举的生成源是:
public final class models.UserStatus extends java.lang.Object{
public static final scala.Enumeration$Value Busy();
public static final scala.Enumeration$Value Free();
public static final scala.Enumeration$ValueSet$ ValueSet();
public static final scala.Enumeration$Value withName(java.lang.String);
public static final scala.Enumeration$Value apply(int);
public static final int maxId();
public static final scala.Enumeration$ValueSet values();
public static final java.lang.String toString();
}

我正在尝试为 play framework 2.0 实现枚举映射器
def enumFormat[E <: Enumeration](enum: E): Formatter[E#Value] = new Formatter[E#Value] {
def bind(key: String, data: Map[String, String]) = {
Formats.stringFormat.bind(key, data).right.flatMap { s =>
scala.util.control.Exception.allCatch[E#Value]
.either(enum.withName(s))
.left.map(e => Seq(FormError(key, "error.enum", Nil)))
}
}
def unbind(key: String, value: E#Value) = Map(key -> value.toString)
}

而这个调用映射器的方法
def enum[E <: Enumeration](enum: E): Mapping[E#Value] = of(enumFormat(enum))

这意味着映射器在使用表单绑定(bind)时会自动在枚举之间进行转换

使用伪代码。
package models {
object UserStatus extends Enumeration {
val Free = Value("free")
val Busy = Value("busy")
}

case class User(
status: UserStatus.Value = UserStatus.Free
)
}

package controllers {
imports models._
val userForm = Form(
mapping(
"status" -> enum(UserStatus)
)(User.apply)(User.unapply)
)
}

最佳答案

您的问题可能来自这样一个事实:在 Scala 中,您可以对类型和值使用相同的标识符。

当您编写以下内容时:

object Foo extends Enumeration {
val A, B, C = Value
}

你定义一个 Foo 对象 ,但您没有定义 Foo 类型 .如果您来自 Java 背景,您可能会觉得这种行为并不直观。

那么 Foo 的类型是什么?枚举值?他们的类型是 Foo.Value (这称为路径依赖类型)。

如果要定义 Foo type对应枚举值类型,可以给 Foo.Value取别名类型:

object Foo extends Enumeration {
type Foo = Value // Type alias
val A, B, C = Value
}

现在您可以通过编写 Foo.Foo 来引用枚举类型。 .您可以导入 Foo 的字段减少语法开销的对象:

import Foo._
def bar(foo: Foo): String = foo match {
case A => "value A"
case B => "value B"
case C => "value C"
}

在上面的代码中,第一行是指 Foo对象,第二行指的是 Foo类型。

关于scala - 如何从其他包中引用 scala 枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10227231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com