2016-05-30 4 views
0

я есть это ниже кодНе может прорыва петли Еогеасп в Скале

> .foreach("${plist}", "newshole") { 
>  exec(
>   http("get the user id") 
>   .get("${newshole}/jcr:content.1.json") 
>   .headers(headers_2) 
>   .check(bodyString.saveAs("Res1")) 
>  ) 
>  exec(session => { 
>   var mynewshole = session("Res1").as[String] 
>   if (!mynewshole.contains("testingInProgress")) { 
>   println("Doesn't contain: " + mynewshole) 
>   (http("post the user id") 
>    .post("${newshole}/jcr:content") 
>    .headers(headers_2) 
>    .formParam("testingInProgress", session.userId)) 
>   exec(http("Create print package") 
>    .post("/bin/cqtg-create-print-package.do") 
>    .headers(headers_2) 
>    .formParam("newsholeId", "${plist}") 
>    .formParam("digitalMasterId", "1adpy8") 
>    .check(status.is(200))) 
> 
>   } 
>   session 
>  }) 
>  } 

я хочу, чтобы вырваться из:

> if (!mynewshole.contains("testingInProgress")) { 
>   println("Doesn't contain: " + mynewshole) 
>   (http("post the user id") 
>    .post("${newshole}/jcr:content") 
>    .headers(headers_2) 
>    .formParam("testingInProgress", session.userId)) 
>   exec(http("Create print package") 
>    .post("/bin/cqtg-create-print-package.do") 
>    .headers(headers_2) 
>    .formParam("newsholeId", "${plist}") 
>    .formParam("digitalMasterId", "1adpy8") 
>    .check(status.is(200))) 
> 
>   } 
>   session 

в основном я хочу выйти из цикла, когда мое первое условие встречаются. Поэтому я хочу использовать приведенный ниже код в соответствии с учебными пособиями по scala, но не знаю, куда положить прерывистую команду, поскольку она дает мне ошибки.

> breakable{ 
>    code() 
>   break; 
>   } 

, но не знаю, где его поставить. Любая идея ????

+2

вы можете рассмотреть ** рекурсию **, так как вы используете Scala :-) – pietro909

+0

в основном я просто хочу вырваться из цикла, так как scala donot имеет разрыв или продолжить явно определенную.История бит в новой scala нужна помощь! !! :( – shab

ответ

3

Scala на самом деле не предлагает простые в использовании примитивы управления потоком /. Это не функциональный способ делать что-то.

Большинство методов, доступных в коллекциях Scala, таких как foreach, предназначены для проверки/изменения всей коллекции. Исключения включают в себя: contains, corresponds, exists, forall, indexWhere и т. Д. Вы заметите, что большинство (все?) Имеют дело с Booleans, либо как аргумент (предикатная функция), либо как возвращаемый тип.

Если ваш алгоритм не может быть переработан для использования одного из этих лениво-оцененных методов, я бы рекомендовал вам обратиться за советом @ pietro909 и перепроектировать его как рекурсивную функцию, которая проверяет одно или несколько условий выхода на каждый вызов/рекурсию ,

Я знаю, что это не совсем то, что вы просили, и это правда, вы можете добиться того, что вы хотите, вставив breakable блок в коде, но если вы inspect the source вы увидите, что разрывы реализуются метания/исключая исключения, которые довольно неэффективны и, как правило, стоит избегать.

Но если вы решили идти по этому пути, это должно дать некоторые рекомендации:

scala> import util.control.Breaks 
import util.control.Breaks 

scala> val mybreaks = new Breaks 
mybreaks: scala.util.control.Breaks = [email protected] 

scala> import mybreaks.{break, breakable} 
import mybreaks.{break, breakable} 

scala> breakable { 
    | (1 to 34).foreach(x => if (x > 9) break else println(x)) 
    | println("all done") 
    | } 
1 
2 
3 
4 
5 
6 
7 
8 
9 

Замечание: при break не просто прекратить foreach() заявление, он вспыхивает всего breakable блока ,

Смежные вопросы