Scala “的抽象签名”;没有「;某种类型
我想要一个类型的方法返回它所混合的类型。例如,具有以下精神的事物:Scala “的抽象签名”;没有「;某种类型,scala,mixins,Scala,Mixins,我想要一个类型的方法返回它所混合的类型。例如,具有以下精神的事物: trait A { def withoutA: this.type without A } 因此,在类型A和B带有C的情况下,不带A的方法将具有签名B带有C,在A带有D的情况下,只有D 这是可以实现的吗?如果可以,如何实现 下面是一个如何使用它的示例: trait Limit { def limit(a: Int): this.type without Limit } trait Offset { def offs
trait A {
def withoutA: this.type without A
}
因此,在类型A和B带有C
的情况下,不带A的方法将具有签名B带有C
,在A带有D
的情况下,只有D
这是可以实现的吗?如果可以,如何实现
下面是一个如何使用它的示例:
trait Limit {
def limit(a: Int): this.type without Limit
}
trait Offset {
def offset(a: Int): this.type without Offset
}
val sqlBuilder = new Limit with Offset { ... }
sqlBuilder.limit(2).offset(4) // valid code
sqlBuilder.offset(4).limit(2) // valid code
sqlBuilder.limit(2).limit(4) // invalid code
这里是暗中刺伤,但是类型否定可能在这里起作用
type ¬[A] = A => Nothing
trait A {
def withoutA: this.type with ¬[A]
}
由于目前无法访问REPL,我还没有机会测试这个。我还想知道这个用例
更新:
如果您真正想要的是一个构建器,它在您使用时逐渐减少可用的操作,那么幻影类型和类型安全构建器模式将起到帮助作用:
您可能还需要更新问题的标题,以便其他人更容易找到:)您需要此功能做什么?(只是想知道你认为这对什么有用)。@Jesper不容易描述。一个复合生成器,在应用每一个方法时都会丢失方法。这提供了静态保证,只有有意义的方法才可用。这可以通过类型安全构建器模式实现。正如您可能发现的那样,对强制参数进行至少一次调用并不困难,但很难精确地进行一次调用。我推荐Jim McBeath关于解决这个问题的三部分系列博客:blogpost是一本很棒的读物。但是,您提供的代码并不能解决问题,因为编译器将的类型(使用B{…}的新A)视为Nothing
,因此在该类型上看不到B
的任何成员。因此,基本上,隐式转换是在类型级别上参数化的。好主意。谢谢然而,我仍然在寻找实际问题的答案。我是这里的软件工匠!我的工作是回答实际需求,而不仅仅是回答用户想问的问题:)