Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala “的抽象签名”;没有「;某种类型_Scala_Mixins - Fatal编程技术网

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
的任何成员。因此,基本上,隐式转换是在类型级别上参数化的。好主意。谢谢然而,我仍然在寻找实际问题的答案。我是这里的软件工匠!我的工作是回答实际需求,而不仅仅是回答用户想问的问题:)