Scala / Intellij: блок после false, если введен оператор - PullRequest
0 голосов
/ 12 января 2019

Это самая странная вещь, которую я видел с моим IntelliJ при работе над проектом sbt - я могу поделиться более подробной информацией о сценарии использования, если это необходимо.

У меня есть оператор if, и в отладке я наблюдаю, что блок, следующий за ним, вводится, когда этот оператор оценивается как ложный.

Я пытался запустить sbt compile, sbt reload. Я также сделал недействительными кэши и перезапустил IntelliJ.

Это код:

class MedianOf3Partitioning[T: ClassTag : Ordering] extends QuickSort[T] with MedianOfPartitioning[T] {

  protected val MEDIAN_OF = 3

  override protected def sort(a: Array[T], lo: Int, hi: Int): Array[T] = {
    if (hi > lo || (hi - lo) > MEDIAN_OF) {
      val sampleArray = getSample(a.slice(lo, hi), MEDIAN_OF)
      patchArray(a, lo, hi, sampleArray)
      val j = partition(a, lo, hi)
      sort(a, lo, j - 1)
      sort(a, j + 1, hi)
    } else return super.sort(a, lo, hi)

  }
}

А вот скриншот из сеанса отладки, который демонстрирует, что происходит:

How is this even possible?

Итак, оба условия ложны, но введен код в фигурных скобках после оператора.

Моя версия IntelliJ - 2018,3

Update

Я выполняю код, запустив этот тестовый класс:

class MedianOf3PartitioningSpec extends BaseSpec {

  private val testCase: Array[Char] = "EASYQUICKSORTQUESTION" toCharArray

  behavior of "MedianOf3PartitioningSpec"

  it should "sort" in {
    val medianOf3Partitioning = new MedianOf3Partitioning[Char]
    val maybeSortedArray = medianOf3Partitioning sort(testCase)
    maybeSortedArray shouldBe sorted
  }

}

Я запускал его с помощью IntelliJ (как обычно). Я просто попробовал простую командную строку testOnly *MedianOf3PartitioningSpec, но по той же причине она не работает

Если я разрешу запускать код (игнорируя это странное наблюдение, о котором я рассказывал выше), то проверка завершится неудачно с этим:

[info] - should sort *** FAILED ***
[info]   java.lang.IllegalArgumentException: bound must be positive
[info]   at java.util.Random.nextInt(Random.java:388)
[info]   at scala.util.Random.nextInt(Random.scala:66)
[info]   at ca.vgorcinschi.algorithms2_3.MedianOfPartitioning.getSample(MedianOfPartitioning.scala:14)
[info]   at ca.vgorcinschi.algorithms2_3.MedianOfPartitioning.getSample$(MedianOfPartitioning.scala:13)
[info]   at ca.vgorcinschi.algorithms2_3.MedianOf3Partitioning.getSample(MedianOf3Partitioning.scala:16)
[info]   at ca.vgorcinschi.algorithms2_3.MedianOf3Partitioning.sort(MedianOf3Partitioning.scala:22)
[info]   at ca.vgorcinschi.algorithms2_3.MedianOf3Partitioning.sort(MedianOf3Partitioning.scala:25)
[info]   at ca.vgorcinschi.algorithms2_3.MedianOf3Partitioning.sort(MedianOf3Partitioning.scala:26)
[info]   at ca.vgorcinschi.algorithms2_3.QuickSort.sort(QuickSort.scala:13)
[info]   at ca.vgorcinschi.algorithms2_3.MedianOf3PartitioningSpec.$anonfun$new$1(MedianOf3PartitioningSpec.scala:13)

... где getSample делает это:

trait MedianOfPartitioning [T] {

  this: BaseSort[T] =>

  protected val MEDIAN_OF: Int

  protected def getSample(a: Array[T], medianOf: Int): Array[T] = {
    val sampleArrayOffset = Random.nextInt(a.length - medianOf)
    a.slice(sampleArrayOffset, sampleArrayOffset + medianOf)
  }

  /**
    * Mutate the main array to have at its head the smallest value from sample
    * array and at its last index the biggest value from sample array
    * @param a - target array
    * @param sampleArray - size should be equal to {@link MEDIAN_OF}
    */
  def patchArray(a: Array[T], lo: Int, hi: Int, sampleArray: Array[T]): Unit = {
    val (minVal, maxVal) = ((sampleArray.head, sampleArray.head) /: sampleArray) { case ((tempMin, tempMax), current) =>
      (min(tempMin, current), max(tempMax, current))
    }
    exch(a, a.indexOf(minVal), lo)
    exch(a, a.indexOf(maxVal), hi)
  }
}

Но если в случае правильной оценки выписки getSample не следует вводить в первую очередь (это и есть намерение). Возможно, в комнате есть слон, которого я не вижу, но я был бы признателен, если бы кто-то мог указать мне на это: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...