当我想重复执行n次时,我发现自己编写了这样的代码:
for (i <- 1 to n) { doSomething() }
我正在寻找一个更短的语法:
n.times(doSomething())
Scala中是否存在类似的内容?
修改
我考虑过使用Range的foreach()方法,但是块需要采用它从未使用的参数。
(1 to n).foreach(ignored => doSomething())
答案 0 :(得分:49)
您可以使用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
答案 1 :(得分:34)
Range类有一个foreach方法,我认为这正是你需要的。例如,这个:
0.to(5).foreach(println(_))
制作
0
1
2
3
4
5
答案 2 :(得分:21)
使用scalaz 5:
doSomething.replicateM[List](n)
使用scalaz 6:
n times doSomething
对于大多数类型(更确切地说,对于每个幺半群),这可以正常工作:
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
)。它具有更好的类型安全性,因为您可以这样做:
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中解决这个问题。
答案 3 :(得分:5)
我不知道图书馆里有什么东西。您可以定义可以根据需要导入的实用程序隐式转换和类。
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"))
Rahul在写这篇文章时刚刚发布了类似的答案......
答案 4 :(得分:2)
可以这么简单:
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
答案 5 :(得分:0)
def times(f: => Unit)(cnt:Int) :Unit = {
List.fill(cnt){f}
}