相关疑难解决方法(0)

要在Scala中映射的案例类

有没有一种很好的方法可以转换Scala case class实例,例如

case class MyClass(param1: String, param2: String)
val x = MyClass("hello", "world")
Run Code Online (Sandbox Code Playgroud)

进入某种映射,例如

getCCParams(x) returns "param1" -> "hello", "param2" -> "world"
Run Code Online (Sandbox Code Playgroud)

适用于任何案例类,而不仅仅是预定义的类.我发现你可以通过编写一个询问底层Product类的方法来拉出case类名,例如

def getCCName(caseobj: Product) = caseobj.productPrefix 
getCCName(x) returns "MyClass"
Run Code Online (Sandbox Code Playgroud)

所以我正在寻找类似的解决方案,但对于案例类字段.我想象一个解决方案可能不得不使用Java反射,但是如果案例类的底层实现发生变化,我讨厌在未来的Scala版本中编写一些内容.

目前我正在使用Scala服务器并使用案例类定义协议及其所有消息和异常,因为它们是如此美观,简洁的构造.但是,我需要将它们转换为Java映射,以通过消息传递层发送以供任何客户端实现使用.我当前的实现只是分别为每个案例类定义一个翻译,但是找到一个通用的解决方案会很好.

scala case-class

71
推荐指数
6
解决办法
4万
查看次数

Scala Macros:检查某个注释

感谢上一个问题的答案,我能够创建一个函数宏,使得它返回一个Map将每个字段名称映射到它的类值,例如

...

trait Model

case class User (name: String, age: Int, posts: List[String]) extends Model {
  val numPosts: Int = posts.length

  ...

  def foo = "bar"

  ...
}
Run Code Online (Sandbox Code Playgroud)

所以这个命令

val myUser = User("Foo", 25, List("Lorem", "Ipsum"))

myUser.asMap
Run Code Online (Sandbox Code Playgroud)

回报

Map("name" -> "Foo", "age" -> 25, "posts" -> List("Lorem", "Ipsum"), "numPosts" -> 2)
Run Code Online (Sandbox Code Playgroud)

这就是生成Tuples的Map地方(见Travis Brown的回答):

...

val pairs = weakTypeOf[T].declarations.collect {
  case m: MethodSymbol if m.isAccessor =>
    val name = c.literal(m.name.decoded)
    val …
Run Code Online (Sandbox Code Playgroud)

annotations scala scala-macros

11
推荐指数
1
解决办法
931
查看次数

对案例类字段的简单迭代

我正在尝试编写一个泛型方法来迭代案例类的字段:

case class PriceMove(price: Double, delta: Double)

def log(pm : PriceMove) { info("price -> " + price + " delta -> " + delta)}

我需要log能够处理任何案例类.什么只需要log处理case类的参数类型和实际的泛型字段迭代代码?

scala case-class

7
推荐指数
1
解决办法
9970
查看次数

标签 统计

scala ×3

case-class ×2

annotations ×1

scala-macros ×1