相关疑难解决方法(0)

Scala中的动态混合 - 是否可能?

我想要实现的是正确实施

def dynamix[A, B](a: A): A with B
Run Code Online (Sandbox Code Playgroud)

我可能知道B是什么,但不知道A是什么(但如果B有自我类型,那么我可以在A上添加一些约束).scala编译器对上面的签名很满意,但我还不知道实现的样子 - 如果可能的话.

我想到了一些选择:

  • 使用反射/动态代理.
    • 最简单的情况:A是Java级别的接口+我可以实例化B并且它没有自我类型.我想这不会太难(除非我遇到一些令人讨厌的意外问题):
      创建一个新的B(b),还有一个实现A和B的代理,并使用委托给a或b的调用处理程序.
    • 如果B无法实例化,我仍然可以创建它的子类,并按照上面的描述进行操作.如果它也有自我类型,我可能需要一些代表团到处,但它可能仍然有效.
    • 但是,如果A是具体类型并且我找不到合适的接口呢?
    • 我会遇到更多问题(例如与线性化相关的东西,或者帮助Java互操作性的特殊构造)?
  • 使用一种包装代替mixin并返回B [A],a可从b访问.
    不幸的是,在这种情况下,调用者需要知道嵌套是如何完成的,如果混合输入/包装多次完成(D [C [B [A]]])可能会非常不方便,因为它需要找到正确的嵌套级别可以访问所需的功能,所以我不认为它是一个解决方案.
  • 实现编译器插件.我没有经验,但我的直觉是它不会是微不足道的.我认为Kevin Wright的autoproxy插件有一个类似的目标,但它不足以解决我的问题(但是?).

你有其他可能有用的想法吗?你会推荐哪种方式?期待什么样的"挑战"?
或者我应该忘记它,因为目前的Scala限制是不可能的?

我的问题背后的意图:说我有一个业务工作流程,但它不是太严格.一些步骤具有固定顺序,但其他步骤没有,但最后必须完成所有步骤(或者其中一些步骤需要进一步处理).
更具体的例子:我有一个A,我可以添加B和C. 我不在乎先做哪个,但最后我需要A带B和C.

评论:我对Groovy不太了解,但是我想出了这个问题,我想这或多或少与我想要的一样,至少在构思上.

scala mixins

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

Scala:使用特征复制案例类

我是Scala的新手,我有一个关于复制案例类的最佳方法的问题,同时保留来自特征的数据.例如,假设我有以下内容:

trait Auditing {

  var createTime: Timestamp = new Timestamp(System.currentTimeMillis)
}

case class User(val userName: String, val email: String) extends Auditing

val user = User("Joe", "joe@blah.com")
Run Code Online (Sandbox Code Playgroud)

然后我想创建一个更改了一个参数的新副本:

val user2 = user.copy(email = "joe@newemail.com")
Run Code Online (Sandbox Code Playgroud)

现在,在上面的示例中,属性createTime不会被复制,因为它未在User case类的构造函数中定义.所以我的问题是:假设将createTime移动到构造函数中不是一个选项,获取包含特征值的User对象副本的最佳方法是什么?

我正在使用Scala 2.9.1

提前致谢!乔

scala

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

为什么我们不能两次混合特质?

Scala代码:

trait Box {
  def put(num:Int) = println("Put number: " + num)
}

trait DoubleBox extends Box {
  override def put(num:Int) = super.put(2*num)
}

object MyBox extends Box with DoubleBox

MyBox.put(3)
Run Code Online (Sandbox Code Playgroud)

它工作正常并打印 6

但是当我尝试:

object MyBox extends Box with DoubleBox with DoubleBox
Run Code Online (Sandbox Code Playgroud)

它无法编译:

error: trait DoubleBox is inherited twice
Run Code Online (Sandbox Code Playgroud)

我想知道为什么我的代码看起来合理时有这样的限制?

inheritance scala traits

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

标签 统计

scala ×3

inheritance ×1

mixins ×1

traits ×1