Как сделать это условие более похожим на скалу - PullRequest
1 голос
/ 23 августа 2011

У меня есть следующий метод:

def generateAssociatedImages : List[ImageFileEntry] = {

    if ( this.page > 1 && this.page < this.fileEntry.pageCount ) {
        List( copyWithPage( this.page - 1 ), copyWithPage( this.page + 1 ) )
    } else {
        if ( page == 1 && page != file.fileEntry.pageCount ) {
            List( copyWithPage( this.page + 1 ) )
        } else {
            List( copyWithPage( this.page - 1 ) )
        }
    }

}

Но этот выглядит слишком похоже на Java (если бы я использовал Ruby, я бы сделал переключатель / регистр для диапазона, а затем сделал бы другие сравнения). Есть ли более функциональный способ сделать это в Scala?

Поведение довольно простое:

  • , если ввод - страница 1, а всего страниц - 3, вывод - [2]
  • , если ввод - страница 2, а всего страниц - 3, вывод - [1,3]
  • если ввод - страница 3, а всего страниц - 3, вывод - [2]

Я ищу идиоматическое решение, я все еще новичок в Scala.

Было бы замечательно, если бы я мог сделать что-то вроде:

( 1 until 3 ).hasNext( 2 )

Ответы [ 3 ]

7 голосов
/ 23 августа 2011

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

def generateAssociatedImages: List[ImageFileEntry] = {
    val pageCount = fileEntry.pageCount
    page match {
        case `pageCount` if page == 1 => List()
        case `pageCount` => List(copyWithPage(pageCount - 1))
        case 1 => List(copyWithPage(2))
        case x => List(copyWithPage(x - 1), copyWithPage(x + 1))
    }
}
2 голосов
/ 23 августа 2011
def ifTrue[T](c : Boolean, v : =>T) = if (c) Some(v) else None

def generateAssociatedImages = List(ifTrue(this.page > 1, -1)), ifTrue(this.page < this.fileEntry.pageCount, 1)).flatten.map(d => copyWithPage(this.page + d))
0 голосов
/ 24 августа 2011

Вы ищете соседние страницы?

val pages = 1 to this.fileEntry.pageCount

implicit def toNext(r: Range) = new { 
    def next(n: Int) = r.view sliding 2 find (n == _.head) map (_.last)
}

def adjacent(page: Int) = List(pages next page, pages.reverse next page).flatten

def generateAssociatedImages : List[ImageFileEntry] = 
    adjacent(this.page) map copyWithPage

Я признаю, что это немного чрезмерно инженерно. Но это элегантно. Он также не работает для одностраничных диапазонов из-за ошибки в sliding.

...