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

在Scala中使用可变长度索引的“update”方法

发布时间:2020-12-16 18:58:33 所属栏目:安全 来源:网络整理
导读:我正在编写类似于具有可变维度的数组的代码.我所做的是维护线性底层集合并使用索引访问方法将其包装起来.由于数据结构的维度未知,我写了类似的东西 def apply(i: Int*): Double = ... 而且效果很好.但是,我不能做同样的事情更新方法和运算符,如=,所以我最终
我正在编写类似于具有可变维度的数组的代码.我所做的是维护线性底层集合并使用索引访问方法将其包装起来.由于数据结构的维度未知,我写了类似的东西

def apply(i: Int*): Double = ...

而且效果很好.但是,我不能做同样的事情更新方法和运算符,如=,所以我最终写的方法,如

def set(v: Double,i: Int*) ...
def add(v: Double,i: Int*) ...

这很好,但不是我真正想要的.我想有关更新的问题可以通过两种方式解决:

>更改更新函数中参数的顺序,这使它看起来很奇怪.
>允许可变长度参数不是最后一个.我发现这个问题在一般设置中提出,可以通过使用currying函数来解决,这里不适用.

关于=的问题似乎更复杂,甚至在索引具有固定长度时也存在.也许我们可以添加一个具有=运算符的对象并使用this(…)来获取对象(这样(…)= v将调用我们期望的某个方法),但这会与apply方法冲突.

如果有人对上述任何问题有解决方案或有理由说我们不能编写这样的代码,请分享您的想法!谢谢?

解决方法

我现在看到的最简单的解决方案是为要支持的每个维度提供许多不同的更新重载.假设您可以确定您将使用的最大尺寸为10,这意味着您将需要10次重载.这可能看起来不太实用,但我可以很容易地将其抽象出去,因此它实际上非常实用:

trait MultiKeyUpdate[K,V] {
  def doUpdate( k: K* )( v: V )
  def update(k1: K,v: V) { doUpdate( k1 )( v ) }
  def update(k1: K,k2: K,v: V) { doUpdate( k1,k2 )( v ) }
  def update(k1: K,k3: K,k2,k3 )( v ) }  
  // ... and so on,up until max dimension ...
}

用法:

class C extends MultiKeyUpdate[Int,Double] {
  def apply(i: Int*): Double = {
    println("Returning element " + i.mkString("[",","]"))
    123
  }
  def doUpdate( i: Int* )( v: Double ) {
    println("Updating element " + i.mkString("[","]") + " to value " + v)
  }
}

在REPL中进行一些测试:

scala> val o = new C
o: C = C@12798c1
scala> o(1,2,3)
Returning element [1,3]
res3: Double = 123.0
scala> o(1,3) = 5.0
Updating element [1,3] to value 5.0
scala> o(1,3) += 7.0
Returning element [1,3]
Updating element [1,3] to value 130.0

(编辑:李大同)

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

    推荐文章
      热点阅读