2015-02-01 3 views
4

Scala에서 if-else-else를 기능적으로 대체하려면 어떻게 사용합니까? 중간 변수를 사용하지 않고스칼라에서 if-else-else 바꾸기

val tempList = List("a", "b", "c") 
val list = if (flag) "x" :: tempList else tempList 

이 더 나은 방법이있을 수 :이처럼 생각하고

var list = List("a", "b", "c") 

if (flag) { // flag is boolean variable 
    // do something inside if flag is true 
    list = "x" :: list 
} 
// if flag is false, nothing happened 

가 작동 할 수 있도록하기 : 필수적 스타일이 전형적인 패턴과 같은 예를 들어

, ?

누군가는 스칼라에서 if-without-else를 어떻게 제거합니까?

+1

, 보통 없이는'if'가없는'else' - 당신은 항상 다시 * 일부 * 값을 얻을 필요가있다. 기본값을 제공하는 함수를 사용할 때 명시 적으로 선언 할 필요가 없을 수도 있습니다. – Bergi

+5

두 번째 버전은 나에게 잘 어울립니다. 어떤 일이 벌어지고, 변경 가능한 변수는없고, 아무런 문제가 없습니다. –

답변

4

일반적으로 임시 변수로 네임 스페이스가 어지럽히 지 않도록하는 것이 좋습니다. 그래서 이런 일이 더 좋을 것이다 :

val list = { 
    val temp = List("a", "b", "c") 
    if (flag) "x" :: temp else temp 
} 

또는

val list = List("a", "b", "c") match { 
    case x if flag => "x" :: x 
    case x => x 
} 

당신이 찾아내는 경우에 자신이 이것을 많은을하고 성능이 큰 문제가되지 않습니다, 확장 메서드를 정의하는 데 편리 할 수도 있습니다 . 내 개인 라이브러리에 하나를 가지고하는 것은 다음과 같습니다이 :

implicit class AnythingCanPickFn[A](private val underlying: A) extends AnyVal { 
    /** Transforms self according to `f` for those values where `p` is true. */ 
    @inline def pickFn(p: A => Boolean)(f: A => A) = 
    if (p(underlying)) f(underlying) else underlying 
} 

당신은 너무 같은이 하나를 사용하십시오 :

List("a", "b", "c").pickFn(_ => flag){ "x" :: _ } 
+1

나는 지역적인 "변수"원칙에 완전히 동의합니다. 혼란을 줄이려면 첫 번째 경기에서'x'를'_'로 대체 할 수 있습니다 –

+3

''x'' :'''''''''대소 문자를 구별하지 않아야합니까? – Bergi

+0

@Bergi - 그래야합니다. 고침, 고마워! (테스트 후 변수의 이름을 바꾸는 것보다 잘 알아야합니다.) –

0
그것은 scalaz의 삼항 연산자를 사용하여 수행 할 수 있습니다

import scalaz._ 
import Scalaz._ 

val temp = List("a", "b", "c") 
val list = (flag) ? ("x" :: temp) | temp 


libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.0.6" 
2

선택 부분을 선택 사양으로 만들어 고양이를 털어 낼 수 있습니다.

scala> val flag = true 
flag: Boolean = true 

scala> Option("x").filter(_ => flag).toList ::: "a" :: "b" :: "c" :: Nil 
res0: List[String] = List(x, a, b, c) 

scala> val flag = false 
flag: Boolean = false 

scala> Option("x").filter(_ => flag).toList ::: "a" :: "b" :: "c" :: Nil 
res1: List[String] = List(a, b, c) 

또는 함수형 프로그래밍에서 반대로

scala> sys.props.get("flag") 
res3: Option[String] = None 

scala> sys.props.get("flag").map(_ => "x").toList ::: List("a","b","c") 
res4: List[String] = List(a, b, c) 

scala> sys.props("flag") = "true" 

scala> sys.props.get("flag").map(_ => "x").toList ::: List("a","b","c") 
res6: List[String] = List(x, a, b, c)