是否有一个在Scala中执行一个块的简短语法?

当我想重复执行n次时,我发现自己正在编写这样的代码:

for (i <- 1 to n) { doSomething() } 

我正在寻找这样一个简短的语法:

 n.times(doSomething()) 

Scala中是否存在这样的事情?

编辑

我想过使用Range的foreach()方法,但是这个块需要一个从未使用的参数。

 (1 to n).foreach(ignored => doSomething()) 

您可以使用Pimp My Library模式轻松定义一个。

 scala> implicit def intWithTimes(n: Int) = new { | def times(f: => Unit) = 1 to n foreach {_ => f} | } intWithTimes: (n: Int)java.lang.Object{def times(f: => Unit): Unit} scala> 5 times { | println("Hello World") | } Hello World Hello World Hello World Hello World Hello World 

Range类有一个foreach方法,我认为它就是你所需要的。 例如,这个:

  0.to(5).foreach(println(_)) 

生成

0
1
2
3
4

随着斯卡拉5 :

 doSomething.replicateM[List](n) 

随着斯卡拉6 :

 n times doSomething 

而且这个方法和大多数types(更确切地说,对于每个monoid )都是一样的:

 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! 

你也可以说doSomething replicateM_ 5只有当你的doSomething是一个惯用的值时才有效(参见Applicative )。 它有更好的types安全性,因为你可以这样做:

 scala> putStrLn("Foo") replicateM_ 5 res6: scalaz.effects.IO[Unit] = scalaz.effects.IO$$anon$2@8fe8ee7 

但不是这样的:

 scala> { System.exit(0) } replicateM_ 5 <console>:15: error: value replicateM_ is not a member of Unit 

让我看看你在Ruby中取消。

我不知道图书馆里有什么 您可以定义一个实用程序隐式转换和类,您可以根据需要导入。

 class TimesRepeat(n:Int) { def timesRepeat(block: => Unit): Unit = (1 to n) foreach { i => block } } object TimesRepeat { implicit def toTimesRepeat(n:Int) = new TimesRepeat(n) } import TimesRepeat._ 3.timesRepeat(println("foo")) 

拉胡尔刚写了一个类似的答案,而我正在写这个…

它可以像这样简单:

 scala> def times(n:Int)( code: => Unit ) { for (i <- 1 to n) code } times: (n: Int)(code: => Unit)Unit scala> times(5) {println("here")} here here here here here