【问题标题】:Advice on Case Classes/Objects/Matching关于案例类/对象/匹配的建议
【发布时间】:2016-05-05 19:58:50
【问题描述】:

我正在尝试(在我的 Scala 应用程序中)建模(在我的 Scala 应用程序中)在我的网页中显示的选项列表,并且正在想出一个解决方案,用于将从客户端发布的 String 值映射到它在后端。

例如。假设它是Animals 的列表,用户可以选择 1 发布到后端。

Animals
   Polar Bear
   Rabbit
   Great White Shark

收到请求时,我想将 Great White Shark String 转换为 Animal,但不确定如何最好地匹配 String 到后端的适当类型。

到目前为止,我有这个。

sealed abstract class Animal(val name: String)

case object GreatWhite extends Animal("Great White Shark")
case object PolarBear extends Animal("Polar Bear")

这允许我将 UI 中的字符串与我的 Scala 应用程序中的相应案例对象匹配。

def matcher(animal: String) = animal match {
    case GreatWhite.name => GreatWhite
    case PolarBear.name => PolarBear
}

问题

但是,如果 Animal 的列表变长,这个匹配器将非常麻烦,因为我需要为每个 Animal 设置一个 case 表达式。

非常感谢任何有经验的 Scala 人给我指点一个更优雅的解决方案。

【问题讨论】:

  • 您使用哪个框架进行客户端 - 后端通信?
  • 接口如果是 RESTful API 所以它是一个带有 JSON 主体的 POST。
  • 也许玩/喷雾?
  • @Yuval,是的,我目前正在使用 Play 作为后端(可能会使用 Spray 代替,因为如果您不需要 Scala 模板等,我相信它会更轻量级)。前端是一个 Ember 应用程序。
  • 次要注意:Spray 已经有一段时间不活动了,Akka HTTP 模块取代了它 - 我认为它是由 Spray 的原作者开发的。

标签: scala


【解决方案1】:

看起来你需要的只是一个 String to Animal 的哈希表。 这种方法使您能够在恒定时间 O(1) 内获得结果,即使列表不断增长。

val mapping = Map[String, Animal]("Rabbit" -> Rabbit, "Polar Bear" -> PolarBear /* ... */ )

// matcher
mapping.get(animal)

UPD。 下面是一些有用的 cmets。

  sealed abstract class Animal(val name: String)

  case object GreatWhite extends Animal("Great White Shark")
  case object PolarBear extends Animal("Polar Bear")

  val mapping: Map[String, Animal] = Seq(GreatWhite, PolarBear).map(x => x.name -> x).toMap
  mapping

【讨论】:

  • 为了避免拼写错误,也许Rabbit.name -> Rabbit, PolarBear.name -> PolarBear 而不是复制的字符串文字。
  • 有没有办法做到getAllSealedClassObjects.map( _.name -> name)
  • 谢谢 - 我喜欢这样,也感谢 O 符号说明。我可能会同意,但在我将其标记为答案之前,让我看看还有哪些其他解决方案。
  • @Thilo 看起来像是:stackoverflow.com/questions/12078366/…
  • Seq(GreatWhite, PolarBear).map(x => x.name -> x)
【解决方案2】:

你看过枚举吗?如果它们对你有用,枚举有一个.withName 方法http://yefremov.net/blog/scala-enum-by-name/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多