我是Scala的新手,对于编写宏并寻找一些帮助/建议非常陌生.我有以下代码......
trait ValidationRule
case class Required() extends ValidationRule
case class HasLength(l: Int) extends ValidationRule
case class Person(name: String)
myMacro[Person] { p => p.name.is(Required(), HasLength(255)) }
Run Code Online (Sandbox Code Playgroud)
显然这里有一些丢失的代码,但这只是伪问题.
所以给定一个Tree表示p => p.name.is(Required(), HasLength(255))我正在尝试编写一个match/case来选择所有表达式的表达式ValidationRule.就像是:
case TypeApply(Select(_, ....
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议最佳匹配案例能够ValidationRules从"is"方法中提取代表每个"所有"的树列表吗?
我有以下情况/代码;
trait Model {
def myField: String
}
case class MyModel(myField: String) extends Model
Run Code Online (Sandbox Code Playgroud)
在为我的模型类创建DAO的传统模型中,我想创建一个包含一些通用CRUD操作的DAO特征.注意......持久性框架在这里并不重要......问题是在使用泛型的特征中使用案例类方法.
据说我想创造以下特质;
trait DAO[M <: Model] {
def insert(model: M): M = {
... do work
m.copy(myField="someval")
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,代码不会编译,因为泛型M对"案例类"一无所知.如果这里有一些简单的解决方案,可以将泛型声明为需要成为一种案例吗?或者Model trait是否应该声明一个任何扩展类必须实现的复制方法,并且它是一个case类吗?
我试图在不使用宏的情况下获取表达式调用的名称.我有以下示例代码:
case class Person(name: String, age: Int)
case class MyClass[T]() {
def doSomething(value: Any)
}
val p = Person("Bob",40)
val my = MyClass[Person]
my.doSomething(p.name)
my.doSomething(p.age)
Run Code Online (Sandbox Code Playgroud)
有没有方法中一个简单的方法doSomething来捕捉表情的名字进行调用时使用,例如捕获String的价值name和age?
我知道,如果我转doSomething成一个宏传递的参数是Expr的Context,我可以得到使用名称Tree的Expr,但是给定宏的复杂性,我的那种东西,以避免在这种情况下,使用一个.