相关疑难解决方法(0)

Scala Macros:使用Scala中的类字段制作地图

假设我有很多类似的数据类.这是一个示例类User,定义如下:

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

  ...

  def foo = "bar"

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

我感兴趣的是自动创建一个方法(在编译时),Map该方法以在运行时调用每个字段名称时将其映射到其值的方式返回.对于上面的例子,让我们说我的方法被调用toMap:

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

myUser.toMap
Run Code Online (Sandbox Code Playgroud)

应该回来

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

你会如何用宏来做到这一点?

这就是我所做的:首先,我创建了一个Model类作为我所有数据类的超类,并在那里实现了这样的方法:

abstract class Model {
  def toMap[T]: Map[String, Any] = macro toMap_impl[T]
}

class User(...) extends Model {
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后我在一个单独的Macros对象中定义了一个宏实现: …

scala case-class scala-macros

33
推荐指数
2
解决办法
8762
查看次数

Java反射:按声明顺序获取字段和方法

有没有办法按照声明的顺序使用反射获取类声明的字段(和方法)?根据该文件,方法和字段的顺序返回的getFields(),getDeclaredFields()等是不确定的.

使用Java反射中建议的注释可以指定像索引之类的东西:类字段和方法的顺序是否标准化?

有没有更好的选择,即不必手动指定索引?

现在在你问我需要什么之前:我们有一个方法,它将一个非常大的数据结构作为输入,并对其进行冗长的计算.为了创建单元测试,我们创建了一个方法,该方法接受输入对象和输出实例,并创建Java源代码(设置输入,调用计算方法,然后断言正确的结果)作为输出.当字段按声明顺序编写时,此代码更易读.

java reflection junit

28
推荐指数
3
解决办法
1万
查看次数

使用Shapeless将嵌套的case类转换为嵌套的Maps

我试图使用Shapeless 来解决这个问题,总结一下,它是关于将嵌套的case类转换为Map [String,Any],这是示例:

case class Person(name:String, address:Address)
case class Address(street:String, zip:Int)

val p = Person("Tom", Address("Jefferson st", 10000))
Run Code Online (Sandbox Code Playgroud)

它想转换p为以下内容:

Map("name" -> "Tom", "address" -> Map("street" -> "Jefferson st", "zip" -> 10000))
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用Shapeless LabelledGeneric,这是我迄今为止所做的:

import shapeless._
import record._, syntax.singleton._
import ops.record._
import shapeless.ops.record._

def writer[T,A<:HList,H<:HList](t:T)
(implicit lGeneric:LabelledGeneric.Aux[T,A],
 kys:Keys.Aux[A,H],
 vls:Values[A]) = {
    val tGen = lGeneric.to(t)
    val keys = Keys[lGeneric.Repr].apply
    val values = Values[lGeneric.Repr].apply(tGen)
    println(keys)
    println(values)
  }
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用递归编写器来检查每个值,并尝试为值中的每个元素创建Map.上面的代码工作正常但是当我想要values使用以下代码迭代时,我得到了这些错误.

values.map(identity)
//or
tGen.map(identity)

Error:(75, 19) could not …
Run Code Online (Sandbox Code Playgroud)

scala shapeless

16
推荐指数
1
解决办法
2567
查看次数

对案例类字段的简单迭代

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

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

java ×1

junit ×1

reflection ×1

scala-macros ×1

shapeless ×1