繁体   English   中英

Scala:递减循环

[英]Scala: decrement for-loop

我注意到以下两个for循环案例有时在大多数情况下都是相同的,但它们的行为却有所不同。 我不知道这种模式,有人知道吗? 谢谢!

情况1:

 for (i <- myList.length - 1 to 0 by -1) { ... }

情况2:

for (i <- myList.length - 1 to 0) { ...}

好吧,他们肯定不会做同样的事情。 n to 0 by -1意思是“从n开始到0, 向后倒数1。因此:

5 to 0 by -1
// res0: scala.collection.immutable.Range = Range(5, 4, 3, 2, 1, 0)

n to 0表示“从n开始到0 向前计数1”。 但是你会发现,如果n > 0 ,则会有什么在该列表中,因为没有办法从任何大于零向前计数为0。

5 to 0
// res1: scala.collection.immutable.Range.Inclusive = Range()

它们产生相同结果的唯一方法是,如果n=0因为从0到0的计数前后是相同的:

0 to 0 by -1   // Range(0)
0 to 0         // Range(0) 

在您的情况下,由于您从myList.length - 1 ,所以当myList的长度为myList.length - 1 ,它们将产生相同的结果。

总而言之,第一个版本很有意义,因为您想通过倒数( by -1 )倒数至0。 而且因为你不会希望从一个长数为0(这是必然非负)的第二个版本是没有意义的。

首先,我们需要更多地了解如何价值成员toby作品。

to -单击此处以获取API文档
to是出现在int,double等类中的值成员。

scala> 1 to 3
res35: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3)

老实说,您不必start to end by step地使用start to end by step和start.to(end,step)也可以工作,如果您更愿意在这个世界上工作。 基本上,如果我们正在谈论整数输入,则to将返回Range.Inclusive对象。


by -单击此处获取API文档

使用此范围的开始和结束值以及新步骤创建一个新范围

scala> Range(1,8) by 3
res54: scala.collection.immutable.Range = Range(1, 4, 7)
scala> Range(1,8).by(3)
res55: scala.collection.immutable.Range = Range(1, 4, 7)

最后,让我们花一些时间看一下步骤从始至终都朝着不同的方向会发生什么。 1 to 3 by -1

这是Range类的源代码,实际上很容易阅读:

def by(step: Int): Range = copy(start, end, step)

因此, by实际调用一个函数copy ,那么什么是副本?

protected def copy(start: Int, end: Int, step: Int): Range = new Range(start, end, step)

因此, copy实际上是用不同的步骤重新创建了一个新范围,然后让我们看一下构造函数或Range本身。

阅读这段代码

  override final val isEmpty = (
       (start > end && step > 0)
    || (start < end && step < 0)
    || (start == end && !isInclusive)
  )

这些情况将触发异常,并且您的结果将是一个空范围,例如1 to 3 by -1 ..etc 1 to 3 by -1情况。

抱歉,由于我现在也在学习Scala,因此帖子的长度已无法控制。
您为什么不阅读Range的源代码,它是由Martin Odersky编写的,只有500行,包括注释:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM