2010-06-15 2 views
4

스칼라 코드에 오류가있어서 혼자서는 해결할 수 없습니다 (저는 스칼라에서 처음입니다). 나는 다음과 같은 코드를 가지고 :"패턴 유형이 예상 유형과 호환되지 않습니다"라는 메시지가 나타나는 이유는 무엇입니까?

def myFunction(list: List[Any]): String = { 
    var strItems : String = ""; 
    list.foreach(item => { 
    strItems += item match { 
     case x:JsonSerializable => x.toJson() 
     case y:String => ("\"" + y + "\"") 
     case _ => item.toString 
    } 
    if(item != list.last) 
     strItems += ","; 
    }) 
    strItems; 
} 

내가 점점 오전 오류는 다음과 같습니다

오류 : 패턴 유형이 예상 유형과 호환되지 않습니다; 발견 : 문자열 필요 : 단위 의 경우 Y : 문자열 => ("\" "+ Y +"\ "")

어떤 생각을 왜?

PS : 코드 myFunction이 여기

답변

7

, 코드는 C를하지 않는 점 무료) 될 일이 그것은 주변에 괄호가 필요하기 때문에 ompile, 즉. strItems += (item match { ... })

이 글을 쓰는에 대한보다 "기능"방법의 라인을 따라 뭔가 될 수있다 : 나는하지 않지만 당신은 아마, 그것은 게으른 더 "확대됨에"확인하기 위해 뷰를 사용할 수

def myFunction(list:List[Any]):String = { 
    val strings:List[String] = list.map{ 
    case x:JsonSerializable => x.toJson() 
    case y:String => ("\"" + y + "\"") 
    case z => z.toString 
    } 
    strings.mkString(",") 
} 

두 개의 기본 루프 ( map & mkString)를 단일 순회로 결합하면 내 머리 꼭대기에서 알 수 있습니다.

+3

'view'를 사용하면'map'과'mkString'을 하나의 순회로 바꿀 수 있습니다. –

0

에 더 성능이 좋은 방법은 (더 간결 수립과 함께 (스칼라 2.8) (w JsonSerializable에 대한 정의/O를) 컴파일 코드의 형태 거기있다 또한

object Javier01 { 
    def 
    javFunc(list: List[Any]): String = { 
    val strItems = new StringBuilder() 

    list.foreach { item => 
     strItems.append (item match { 
//  case x: JsonSerializable => x.toJson() 
     case y: String => "\"" + y + "\"" 
     case _ => item.toString 
     }) 

     if (item != list.last) 
     strItems.append(",") 
    } 
    strItems.toString 
    } 

    def 
    rrsFunc(anys: List[Any]): String = 
    anys map { 
// case x: JsonSerializable => x.toJson() 
     case s: String => "\"" + s + "\"" 
     case x => x.toString 
    } mkString "," 


    def 
    main(args: Array[String]): Unit = { 
    val stuff = List(true, 1, 123.456, "boo!") 

    printf("  stuff : %s%njavFunc(stuff): %s%nrrsFunc(stuff): %s%n%n", 
      stuff, javFunc(stuff), rrsFunc(stuff)) 
    } 
} 

이 실행의 출력은 다음과 같습니다 :

원래의 질문의 관점에서
% scala Javier01 
     stuff : List(true, 1, 123.456, boo!) 
javFunc(stuff): true,1,123.456,"boo!" 
rrsFunc(stuff): true,1,123.456,"boo!" 
관련 문제