Scala и dropWhile

#scala

#scala

Вопрос:

Я старший по HS и новичок в функциональном программировании и Scala. Я пробовал несколько конструкций в Scala REPL и нуждался в некотором руководстве для возвращаемых ответов

 //Defined a tuple

scala> val x =(2.0, 3.0, 1)
x: (Double, Double, Int) = (2.0,3.0,1)

//This made sense to me.  Result is a list of values that are of type Ints
scala> x.productIterator.dropWhile(_.isInstanceOf[Double]).toList
res1: List[Any] = List(1)

**//This DID NOT make sense to me.  Why are Double values included?**
scala> x.productIterator.dropWhile(_.isInstanceOf[Int]).toList
res0: List[Any] = List(2.0, 3.0, 1)


//filter operator seems to work
scala> x.productIterator.toList.filter(x => x.isInstanceOf[Double])
res7: List[Any] = List(2.0, 3.0)
  

Ответ №1:

Boolean):Iterator[A]» rel=»noreferrer»> Iterator.dropWhile удалит любое значение, если оно соответствует предоставленному предикату, и вернет оставшуюся часть итератора:

Пропускает самую длинную последовательность элементов этого итератора, которые удовлетворяют заданному предикату p, и возвращает итератор оставшихся элементов.

Предоставленный вами предикат, который вы передали, завершается с ошибкой для первого элемента, который имеет тип Double , следовательно, это весь итератор, который вы материализуете в List[A] .

Если, например, вы решили удалить while isInstanceOf[Double] , вы бы получили список с одним элементом 1 :

 scala> x.productIterator.dropWhile(_.isInstanceOf[Double]).toList
res13: List[Any] = List(1)