我正在寻找相当于:
for(_ <- 1 to n)
some.code()
这将是最短和最优雅的。 Scala中没有与此类似的内容吗?
rep(n)
some.code()
毕竟这是最常见的结构之一。
PS
我知道实现代表很容易,但我正在寻找预定义的东西。
答案 0 :(得分:78)
1 to n foreach { _ => some.code() }
答案 1 :(得分:15)
您可以创建辅助方法
def rep[A](n: Int)(f: => A) { if (n > 0) { f; rep(n-1)(f) } }
并使用它:
rep(5) { println("hi") }
根据@Jörgs评论,我写了这样一个时间方法:
class Rep(n: Int) {
def times[A](f: => A) { loop(f, n) }
private def loop[A](f: => A, n: Int) { if (n > 0) { f; loop(f, n-1) } }
}
implicit def int2Rep(i: Int): Rep = new Rep(i)
// use it with
10.times { println("hi") }
基于@DanGordon评论,我写了这样一个时间方法:
implicit class Rep(n: Int) {
def times[A](f: => A) { 1 to n foreach(_ => f) }
}
// use it with
10.times { println("hi") }
答案 2 :(得分:9)
我会建议这样的事情:
List.fill(10)(println("hi"))
还有其他方法,例如:
(1 to 10).foreach(_ => println("hi"))
感谢Daniel S.的纠正。
答案 3 :(得分:8)
使用scalaz 6:
scala> import scalaz._; import Scalaz._; import effects._;
import scalaz._
import Scalaz._
import effects._
scala> 5 times "foo"
res0: java.lang.String = foofoofoofoofoo
scala> 5 times List(1,2)
res1: List[Int] = List(1, 2, 1, 2, 1, 2, 1, 2, 1, 2)
scala> 5 times 10
res2: Int = 50
scala> 5 times ((x: Int) => x + 1).endo
res3: scalaz.Endo[Int] = <function1>
scala> res3(10)
res4: Int = 15
scala> 5 times putStrLn("Hello, World!")
res5: scalaz.effects.IO[Unit] = scalaz.effects.IO$$anon$2@36659c23
scala> res5.unsafePerformIO
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!
[从here.复制的摘录]