2016-11-04 5 views
0
val LIST = scala.collection.mutable.MutableList[String]() 
    val filterF = new Function[Path, Boolean] { 
    def apply(x: Path): Boolean = { 
     println("looking into " + x) 
     val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) { 
     println("considered " + x) 
     LIST += x.toString 
     return true 
     } else { 
     println("NOT considered " + x) 
     return false 
     } 
     return flag 
    } 
    } 

filterF 함수 내에서 외부 변수 LIST을 업데이트하려고합니다. 그러나 문제는 println("looking into "+x) 행 이후 코드의 나머지 부분에 도달 할 수 없다는 것입니다.스칼라에 연결할 수없는 코드

val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) { 
     println("considered " + x) 
     LIST += x.toString 
     return true 
     } else { 
     println("NOT considered " + x) 
     return false 
     } 
     return flag 

왜이 코드에 도달 할 수 없는지 이해할 수 없습니다. 실제로이 문제의 원인이되는 문자가 코드에 있습니까?

+0

이된다. 그 런 - 온 라인은 읽을 고통입니다. – Carcigenicate

+0

유머 저; 'System.out.println ("+ x"를 살펴 보았습니까?) 시도 했습니까? –

+0

스크립트의 모든 단일 세미콜론을 꺼내서 다시 붙여 넣으십시오. 한 문장 = 한 줄 – Tim

답변

2

당신이 도달되지 않습니다 기능과 return 문 결국 코드를 ​​떠나 실행 return 컨트롤을 사용하면 수익을

를 사용하지 마십시오

코드를 반환 한 후 연결할 수 없습니다.

if 식의 경우

def bar: Int = { 
    if (true) { 
    return 1 
    } else { 
    return 2 
    } 
    1 + 2 //unreachable 
} 

스칼라의 return 문은 선택 사항이며 기능 코딩 연습을 고려하지 않기 때문에 권장되지 않습니다.

코드 블록의 마지막 표현식 값은 스칼라의 반환 값입니다. 그래서 명시 적 반환에 대해 걱정하지 마십시오는 출구를 호출하는 일을하는 기능적인 방법이 아니다 예외를 던져 프로그램 실행을 중지 프로그램

val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) { 
    println("considered " + x) 
    LIST += x.toString 
    true //removed return 
    } else { 
    println("NOT considered " + x) 
    false // removed return 
    } 

또는 값을 반환하거나 명시 적으로 둡니다. 불행히도 Scala는 그것을 허용합니다. 그러나 당신이 기능적인 세계의 선량한 시민이되고 싶다면. 당신은 그것을 피하는 것이 좋습니다.

않도록 변경 가능한 컬렉션을

사용 mutable 컬렉션은 당신이 그것에 대한 강한 필요성이있는 경우. immutable 콜렉션의 장점이 있습니다

1) 스레드로부터 안전합니다.

2) 버그가 없습니다 (우발적 인 돌연변이에 의한 놀라움이나 막힘 없음).

3) 참조 투명도.

4) 합리적인 성능.

mutable 목록 대신 immutable 목록을 사용하십시오.

사용 스칼라 람다 표기법 및 문법 설탕

문법적 이유가있다. Syntactic sugar는 상용구 코드를 줄입니다. 따라서 코드가 명확하고 깨끗하며 멋지게 보입니다. 코드 유지 관리에 도움이됩니다. 코드는 오랜 시간 동안 버그가 없습니다.

Function1 대신에 특성은 람다 표기법을 사용합니다.

scala> val f = new Function1[String, String] { def apply(str: String): String = str} 
f: String => String = <function1> 

scala> val f = {str: String => str} 
f: String => String = <function1> 

그래서 코드는 당신은 정말 당신의 코드가 더 나은 포맷해야

val paths = List[Path]() //assume you have Paths in it. 

val filter = {path: Path => path.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis } 

val resultList = paths.filter(filter) 
2

이것은 flag하지 데프입니다 발생하지만 문이 사실 또는 거짓를 반환 할 return을 사용하고 있습니다. return 키워드는 함수가 아닌 메소드에만 사용됩니다.

올바른 방법은 어쩌면 좋아 :

val flag = if (x.toString.split("/").last.split("_").last.toLong < System.currentTimeMillis) { 
    println("considered " + x) 
    LIST += x.toString 
    true 
} 
else { 
    println("NOT considered " + x) 
    false 
}