小编use*_*883的帖子

斯卡拉树比赛案例

我是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"方法中提取代表每个"所有"的树列表吗?

macros tree scala

5
推荐指数
1
解决办法
397
查看次数

使用泛型和案例类方法的Scala特征

我有以下情况/代码;

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类吗?

generics scala case-class

2
推荐指数
1
解决办法
814
查看次数

Scala捕获表达式名称没有宏

我试图在不使用宏的情况下获取表达式调用的名称.我有以下示例代码:

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的价值nameage

我知道,如果我转doSomething成一个宏传递的参数是ExprContext,我可以得到使用名称TreeExpr,但是给定宏的复杂性,我的那种东西,以避免在这种情况下,使用一个.

macros scala

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

标签 统计

scala ×3

macros ×2

case-class ×1

generics ×1

tree ×1