2014-06-23 4 views
1

저는 Scala와 Play Framework를 사용하고 있습니다. Widgets의의 Iterable을 감안할 때 다음과 같이 나는 쉽게 그들을 통해 루프 및 인쇄 할 수 있습니다 (이것은 재생 템플릿 내에 있기 때문에 @를 사용하지만이 질문을 위해 무시 될 수있다) :청크 반복 반복자 작성하기

@for(widget <- widgets) { 
    <div>My widget: @widget</div> 
} 

지금 가정 행마다 3 개의 위젯을 표시해야하는 열 레이아웃이 있습니다. 다음과 같이 I 출력 HTML을 싶어 말 : 나는 쓰기를 시도하고

<div class="row"> 
    <div>widget</div> 
    <div>widget</div> 
    <div>widget</div> 
</div> 
<div class="row"> 
    <div>widget</div> 
    <div>widget</div> 
    <div>widget</div> 
</div> 
<div class="row"> 
    <div>widget</div>  
</div> 

상기 모드 검사 (또는 구현 단)를 내면화 할 수 있도록이를 달성하기 반복자를 "청크". 그래서 다른 말로하면, 내가 쓸 수 있다면 좋을 것이라고 생각 :

@chunk(3) { 
    <div class="row"> <!-- gets printed once per chunk --> 

    @for(widget <- widgets) { // gets called for each widget in widgets 
     <div>@widget</div> 
    } 

    </div> <!-- gets printed once per chunk --> 
} 

를하지만이는 다음과 같이 호출 할 수있는 올바른 방법이 아니다 : 청크 호출이되도록 위젯의 컨텍스트를 가질 필요가 "내부"반복이 제대로 호출 될 수 있습니다 (각 청크마다 한 번). 스칼라에서 구현을 진행하는 가장 좋은 방법은 무엇인지 모르겠습니다.

물론 색인을 사용하여 루프를 작성하고 mod 검사를 수행하는 것만으로도됩니다. 그러나 그것이 해결책의 깨끗한 것이라고 생각하지 마십시오. Play의 템플릿 엔진에 내장 된 것과 같은 것을 찾을 수 없었습니다. 예를 들어 Freemarker는 chunked operation을 제공합니다.

답변

2

스칼라 컬렉션 API의 뒷면은 grouped입니다.

범위에 widgets: List[Widget]이 있다고합시다. 정확하고 당신이 무엇을 설명 -

@for(group <- widgets.grouped(3)) { 
    <div class="row"> 
    @for(widget <- group) { 
     <div>@widget</div> 
    } 
    </div> 
} 

grouped(3)

List[Widget]에서 가장 3의 크기가 Iterator[List[Widget]]에서 반환합니다. Int들과

일러스트 레이 티드 :

scala> List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).grouped(3).foreach(println _) 

List(1, 2, 3) 
List(4, 5, 5) 
List(6, 7, 8) 
List(9, 10) 
+0

이 완벽합니다. 고맙습니다 – oym