是否可以动态地指定by子句

时间:2016-05-14 05:45:26

标签: scala

for(i< -1到100 [在这里我想要一个在程序运行期间发生变化的子句])

所以,比方说,我有一个变量,这是当前转弯的理想差距。我用while循环重写了它,但是有没有机会用于构造它。

var gap = 1
for(i<-1 to 100 by gap)
gap+=1

3 个答案:

答案 0 :(得分:0)

目前尚不清楚你在问什么,但请注意以下内容表明gap是可编程的:

scala> for (gap <- 1 to 5) {
     | for (i <- 1 to 100 by gap) {
     |    if (i % 10 == 0) println(s"gap: $gap i: $i") } }
gap: 1 i: 10
gap: 1 i: 20
gap: 1 i: 30
gap: 1 i: 40
gap: 1 i: 50
gap: 1 i: 60
gap: 1 i: 70
gap: 1 i: 80
gap: 1 i: 90
gap: 1 i: 100
gap: 3 i: 10
gap: 3 i: 40
gap: 3 i: 70
gap: 3 i: 100

答案 1 :(得分:0)

by就像任何其他方法一样。和任何其他方法一样,它所采用的参数不一定是文字,它可以是任何有效的Scala表达式,例如字段引用,方法调用或任意更复杂的表达式。

答案 2 :(得分:0)

根据您的评论,这是您实际问题的答案:

doSteps获取范围的开始和结束,计算的初始值,接受计算的当前值的块以及范围中的当前索引,并返回更新的计算和下一个要使用的索引。

  def doSteps[T](start: Int, end: Int)(z: T)(f: (T, Int) => (T, Int)): T =
    {
      if (start < end) {
        val (newz, newStart) = f(z, start)
        doSteps(newStart, end)(newz)(f)
      } else
        z
    } 

(您可以轻松更改它以返回下一个gap - 只需将递归调用更改为doSteams(start + newStart)

示例:

  import scala.util.Random
  doSteps(1, 100)("a")
     { (acc, i) => print(s"$i ")
       (acc + Random.nextPrintableChar(), i + Random.nextInt(5)) }
  //> 1 4 4 8 9 10 12 15 15 17 17 21 24 25 25 29 30 32 35 36 36 40 42 46 49 53 57 
  //| 58 61 61 65 69 72 76 79 83 83 85 86 88 91 95 97
  //| res0: String = a|^on3H-]>Zh]e;R(q3pTB9BQ9Y>p.Q&~_5a?~33ze{w