scala - 在 Scala 中创建和传递包含多种类型的字典的最佳方法是什么?

标签 scala

我所说的字典是指从名称到值的轻量级映射,可以用作方法的返回值。

我知道的选项包括创建案例类、创建匿名对象以及从字符串 -> 任何创建映射。

  • 案例类需要精神开销来创建(名称),但它是强类型的。
  • Anon 对象似乎没有很好的文档记录,而且我不清楚如何将它们用作参数,因为没有命名类型。
  • Maps from String -> Any require casting for retrieval.

还有更好的吗?

理想情况下,这些可以从 json 构建并在适当的时候转换回它。

我不需要静态类型(虽然它会很好,但我知道这是不可能的)- 但我确实想避免显式转换。

最佳答案

这是您想要的基本问题:

def get(key: String): Option[T] = ...

val r = map.get("key")

r 的类型将根据 get 的返回类型定义——那么,该类型应该是什么?从哪里可以定义?如果将其设为类型参数,则相对容易:

import scala.collection.mutable.{Map => MMap}
val map: MMap[String, (Manifest[_], Any) = MMap.empty
def get[T : Manifest](key: String): Option[T] = map.get(key).filter(_._1 <:< manifest[T]).map(_._2.asInstanceOf[T])
def put[T : Manifest](key: String, obj: T) = map(key) = manifest[T] -> obj

例子:

scala> put("abc", 2)

scala> put("def", true)

scala> get[Boolean]("abc")
res2: Option[Boolean] = None

scala> get[Int]("abc")
res3: Option[Int] = Some(2)

当然,问题在于您必须告诉编译器您希望在该键下的 map 上存储什么类型。不幸的是,根本没有办法解决这个问题:编译器无法知道在编译时该键下将存储什么类型。

您采用的任何解决方案最终都会遇到同样的问题:不知何故,您必须告诉编译器应该返回什么类型。

现在,这不应该成为 Scala 程序的负担。以上面的 r 为例...然后您将使用 r 做某事,对吧?你正在使用它的东西将有适合某种类型的方法,既然你知道这些方法是什么,那么你也必须知道 r 的类型必须是什么。

如果不是这种情况,则说明代码存在根本性错误——或者,也许您还没有从想要 map 发展到知道要用它做什么。

关于scala - 在 Scala 中创建和传递包含多种类型的字典的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6918419/

相关文章:

java - Scala.Option 的 Spring RequestParam 格式化程序

javascript - JQuery Mobile 和 Scala.js : How to call functions like "navbar()" or "toolbar()"?

scala - Scala 中的无限流

scala - 如何通过 Scala REPL 使用第三方库?

scala - 使代码的和平不可变

scala - 如何在 Scala 中创建多维向量?

scala - x = y = 1 在 Scala 中?

json - Play框架Json序列化失败

java - Scala 和 Java 实时系统

scala - 高阶函数上的隐式未解决