加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala中的可交换特征

发布时间:2020-12-16 18:40:25 所属栏目:安全 来源:网络整理
导读:我想定义一个具有两个值x,y和交换方法的Swappable特征,这样在从Swappable继承的对象上调用swap会返回x,y切换的同一类型的另一个对象.到目前为止,我最好的是: trait Swappable[T] { val x: T val y: T def swap: Swappable[T] = { val (a,b) = (x,y) new Swa
我想定义一个具有两个值x,y和交换方法的Swappable特征,这样在从Swappable继承的对象上调用swap会返回x,y切换的同一类型的另一个对象.到目前为止,我最好的是:

trait Swappable[T] {
  val x: T
  val y: T
  def swap: Swappable[T] = {
    val (a,b) = (x,y)
    new Swappable[T] { val x=b; val y=a }
  }
}

但这不是我想要的,因为swap的返回类型是一些匿名类,而不是我开始的原始类,所以我得到如下错误:

def direct[S<:Swappable[Int]](s: S): S = if (s.x > s.y) s else s.swap 
<console>:32: error: type mismatch;
 found   : Swappable[Int]
 required: S
       def direct[S<:Swappable[Int]](s: S): S = if (s.x > s.y) s else s.swap
                                                                        ^

有可能做我想做的事吗?交换的正确类型签名是什么?

解决方法

我不知道该怎么做,但我想也许有助于更好地了解你想要发生什么.考虑像一个类

case class Foo(x: Int,y: Int) extends Swappable[Int] {
    val z = x
}

现在,如果你有f = Foo(1,2),f.swap应该给你一个Foo,其中x!= z?如果是这样,Scala内部就没有办法像这样创建一个Foo.如果没有,“交换x和y”真正意味着什么?

也许你真正想要的是这样的:

trait Swappable[A,T] {
    this: A =>

    val x: T
    val y: T
    def cons(x: T,y: T): A

    def swap = cons(y,x)
}

case class Foo(x: Int,y: Int) extends Swappable[Foo,Int] {
    val z = x

    def cons(x: Int,y: Int) = copy(x=x,y=y)
}

但我不确定.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读