41 votes

La boucle de répétition la plus élégante de Scala

Je recherche l'équivalent de :

 for(_ <- 1 to n)
  some.code()

ce serait le plus court et le plus élégant. N'y a-t-il pas dans Scala quelque chose de similaire ?

 rep(n)
  some.code()

C'est l'une des constructions les plus courantes après tout.

PS

Je sais que c'est facile à mettre en œuvre rep, mais je cherche quelque chose de prédéfini.

87voto

Daniel C. Sobral Points 159554
1 to n foreach { _ => some.code() }

20voto

sschaef Points 20242

Vous pouvez créer une méthode d'assistance

 def rep[A](n: Int)(f: => A) { if (n > 0) { f; rep(n-1)(f) } }

et l'utiliser :

 rep(5) { println("hi") }

Sur la base du commentaire de @Jörgs, j'ai écrit une telle méthode de temps :

 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") }

Sur la base des commentaires de @DanGordon, j'ai écrit une telle méthode de temps :

 implicit class Rep(n: Int) {
    def times[A](f: => A) { 1 to n foreach(_ => f) } 
}

// use it with
10.times { println("hi") }

10voto

Landei Points 30509

Je suggérerais quelque chose comme ceci :

 List.fill(10)(println("hi"))

Il existe d'autres moyens, par exemple :

 (1 to 10).foreach(_ => println("hi"))

Merci à Daniel S. pour la correction.

10voto

missingfaktor Points 44003

Avec 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!

[ Extrait copié d' ici. ]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X