List Scala:循环的减量

List Scala:循环的减量,list,scala,for-loop,List,Scala,For Loop,我注意到以下两种for循环情况有时表现不同,而大多数时候它们是相同的。我想不出模式,有人知道吗?谢谢 案例1: for (i <- myList.length - 1 to 0 by -1) { ... } for(i好吧,他们肯定不会做同样的事情。n到0乘以-1意味着“从n开始,然后到0,倒数乘以1。因此: 5 to 0 by -1 // res0: scala.collection.immutable.Range = Range(5, 4, 3, 2, 1, 0) 而n到0意味着

我注意到以下两种for循环情况有时表现不同,而大多数时候它们是相同的。我想不出模式,有人知道吗?谢谢

案例1:

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

for(i好吧,他们肯定不会做同样的事情。
n到0乘以-1
意味着“从
n开始,然后到0,倒数乘以1。因此:

5 to 0 by -1
// res0: scala.collection.immutable.Range = Range(5, 4, 3, 2, 1, 0)
n到0
意味着“从
n开始,然后以1向前计数到0”。但是您会注意到,如果
n>0
,那么该列表中将没有任何内容,因为无法从大于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
的长度为1时,它们将产生相同的结果


总之,第一个版本是有意义的,因为您希望通过倒计时(
by-1
)来倒计时到0。而第二个版本没有意义,因为您不希望从一个长度(必须是非负的)向前计数到0.

首先,我们需要了解更多关于
to
by
的值成员的工作原理

-点击查看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,step)也会起作用。基本上,
to
将返回一个范围。如果我们谈论整数输入,则包含对象


by
-点击查看API文档

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


最后,让我们花一些时间来看看当一个步骤从开始到结束的方向不同时会发生什么

下面是Range类的源代码,它实际上非常容易阅读:

def by(step: Int): Range = copy(start, end, step)
因此,
实际上是调用一个函数
copy
,那么什么是copy呢

protected def copy(start: Int, end: Int, step: Int): Range = new Range(start, end, step)
因此,
copy
实际上是用不同的步骤重新创建一个新的范围,然后让我们看看构造函数或范围本身

阅读这段代码

  override final val isEmpty = (
       (start > end && step > 0)
    || (start < end && step < 0)
    || (start == end && !isInclusive)
  )
覆盖最终值isEmpty=(
(开始>结束&步骤>0)
||(开始<结束和步骤<0)
||(开始==结束&&!isInclusive)
)
这些情况将触发异常,在
1到3乘-1
等情况下,结果将为空

很抱歉,由于我现在也在学习Scala,因此我的文章长度变得失控。

你为什么不读一下的源代码,它是由Martin Odersky编写的,只有500行,包括注释:)

你能更具体地说明什么是“不同”还是“相同”吗“myList的哪些值产生了这些条件?案例2似乎在大多数情况下都能正常工作。但是我遇到了一个场景,myList有10个元素,它根本没有经过for循环。但这10个元素myList适用于案例1。
protected def copy(start: Int, end: Int, step: Int): Range = new Range(start, end, step)
  override final val isEmpty = (
       (start > end && step > 0)
    || (start < end && step < 0)
    || (start == end && !isInclusive)
  )