【问题标题】:What is ArrayBuffer copyToArray's Implementation?ArrayBuffer copyToArray 的实现是什么?
【发布时间】:2021-04-06 14:27:23
【问题描述】:

当我在我的 IDE 中导航 ArrayBuffer[Byte]().toArray 实现时,它会带我去,

def toArray[B >: A : ClassTag]: Array[B] = {
  if (isTraversableAgain) {
    val result = new Array[B](size)
    copyToArray(result, 0)
    result
  }
  else toBuffer.toArray
}

copyToArray 实现带我去,

  def copyToArray[B >: A](xs: Array[B], start: Int): Unit =
    copyToArray(xs, start, xs.length - start)

copyToArray 以三个 args 结尾,

  def copyToArray[B >: A](xs: Array[B], start: Int, len: Int): Unit

无法找到在运行时使用了copyToArray 的哪个实现。使用的实现是什么?有没有办法发现 IDE 无法轻松导航到的实现?

【问题讨论】:

    标签: arrays list scala


    【解决方案1】:

    toArraycopyToArray[B >: A](Array[B], Int) 定义在 ArrayBuffer 的某些超类/超特征中。因为您已经在查看超类型,所以当您要求 IDE 将您带到 copyToArray[B >: A](Array[B], Int, Int) 的定义时,它只会进一步“向上”查找继承树,显然它只会找到它的抽象声明。您需要“向下”查找以发现实际实现会覆盖此声明。您的 IDE 应该具有某种“查找实现”功能。在这种情况下,ArrayBuffer 类本身具有the final definition

    【讨论】:

    • 我明白了。您能否请我指出 Scala 2.11.12 中使用的copyToArray 实现?似乎不在ArrayBuffergithub.com/scala/scala/blob/2.11.x/src/library/scala/collection/…
    • 另外,Find Implementations 在我的情况下不起作用 - 当我在 IntelliJ IDE 中按 Opt+Cmd+B 时,它显示 No Implementation Found。我在这里错过了什么吗?我在应用程序层代码中使用 Find Implementations,并且该功能似乎可以正常工作。
    • @haltTm IntelliJ 被集合库的不稳定所击败(不幸但并不意外)或者(至少我认为这个选项存在)您已将 IntelliJ 设置为“忽略库中的实现”或者其他的东西。无论如何,我现在没有安装它,所以我只是打开了一个 REPL 并发起了一个堆栈跟踪 (try { (1 to 10).to[ArrayBuffer].copyToArray(null, 0, 0) } catch { case e => e.printStackTrace() })。 github.com/scala/scala/blob/…
    • 谢谢,通过错误输出代码来生成堆栈跟踪绝对是一个巧妙的技巧。我将继续调查我的 IDE 行为异常的原因并发布更新
    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    相关资源
    最近更新 更多