2013-06-10 2 views
0

Twitter 스칼라 스쿨에서 스칼라로 가려고하지만 구문 오류가 발생했습니다. 패턴 매칭 코드를 실행하면 컴파일러가 "오류 : 찾을 수 없음 : 값 & &"이라는 메시지와 함께 다시 돌아옵니다. 스칼라에서 튜토리얼이 작성되었지만 현재 작동하지 않을 때 효과가 있었던 것을 가져 오도록 뭔가가 변경 되었습니까? 관련된 클래스는 클래스 구성원과 일치 "오류 : 찾을 수 없음 : 값 &&"

bobk-mbp:Scala_School bobk$ sbt console 
[info] Set current project to default-b805b6 (in build file:/Users/bobk/work/_workspace/Scala_School/) 
[info] Starting scala interpreter... 
[info] 
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_17). 
Type in expressions to have them evaluated. 
Type :help for more information. 
... 
scala> def calcType(calc: Calculator) = calc match { 
    | case calc.brand == "hp" && calc.model == "20B" => "financial" 
    | case calc.brand == "hp" && calc.model == "48G" => "scientific" 
    | case calc.brand == "hp" && calc.model == "30B" => "business" 
    | case _ => "unknown" 
    | } 
<console>:9: error: not found: value && 
     case calc.brand == "hp" && calc.model == "20B" => "financial" 
           ^
<console>:10: error: not found: value && 
     case calc.brand == "hp" && calc.model == "48G" => "scientific" 
           ^
<console>:11: error: not found: value && 
     case calc.brand == "hp" && calc.model == "30B" => "business" 
           ^
scala> 

어떻게 내가 집단 구성원에 일치하고있을 때의 내 경우에 사용 사례를 얻을 수 ...

class Calculator(pBrand: String, pModel: String) { 
    /** 
    * A constructor 
    */ 
    val brand: String = pBrand 
    val model: String = pModel 
    val color: String = if (brand.toUpperCase == "TI") { 
    "blue" 
    } else if (brand.toUpperCase == "HP") { 
    "black" 
    } else { 
    "white" 
    } 

    // An instance method 
    def add(m: Int, n: Int): Int = m + n 
} 

class ScientificCalculator(pBrand: String, pModel: String) extends Calculator(pBrand: String, pModel: String) { 
    def log(m: Double, base: Double) = math.log(m)/math.log(base) 
} 

class EvenMoreScientificCalculator(pBrand: String, pModel: String) extends ScientificCalculator(pBrand: String, pModel: String) { 
    def log(m: Int): Double = log(m, math.exp(1)) 
} 

내 REPL이 같이 보입니다입니까?

미리 감사드립니다. 나는 이것에 처음이에요. _ 당신이, 당신이 calc이있는 콘크리트 가치를 귀찮게하지 않는 것을 나타냅니다 만의로

calc match { 
    case _ if calc.brand == "hp" && calc.model == "20B" => "financial" 
    ... 
} 

: 당신이 패턴 조건을 테스트 할 때

+0

Btw, 당신은 스칼라의 오래된 버전을 사용합니다. 현재 버전은'2.10.2'입니다. – sschaef

+0

SBT 콘솔에 더 최신 버전의 스칼라를 사용하게하면 결과가 동일합니다. –

+0

물론,하지만 오래된 버전은 오래된 버전입니다 ... – sschaef

답변

3

귀하의 경우와 같이, 당신은 단지 가드를 사용하지만, 일반 패턴 매칭에 충실 할 수없는, 값이 일치하는 경우 :

def calcType(calc: Calculator) = (calc.brand, calc.model) match { 
    case ("hp", "20B") => "financial" 
    case ("hp", "48G") => "scientific" 
    case ("hp", "30B") => "business" 
    case _    => "unknown" 
} 

내가 구문 분석이 하나 더 쉽게 찾을 수 있습니다.

+0

그게 내가 말하는거야! 이 버전이 케이스의 정신을 정확히 파악한다고 생각하기 때문에 나도 옳은 답변 확인을 취소 할 수 없습니다. 여기 정확히 무슨 일이 일어난거야? 함수가 브랜드와 모델 값을 계산기에서 터플로 변환하여 해당 아이를 경기를 통해 보냅니다. –

+0

네, 여기서 일어나는 것은 튜플과 일치하는 것입니다. 또한 계산기가 사례 클래스 인 경우 'calc match {case Calculator ("hp", "20B") => "financial"....'과 같은 것을 쓸 수 있습니다. * (뻔뻔한 플러그 - 실제로는 실행 취소 할 수 있습니다) * –

+0

@BobKuhar : 정답을 실행 취소 할 수 있습니다. 다른 하나를 올바른 것으로 표시하십시오 ... – sschaef

2

는, 당신은 guard를 사용할 필요가 가드에 언급 된 다른 조건.

, BTW conjunction extractor 작성할 수 있습니다 :

object && { 
    def unapply[A](a: A) = Some((a, a)) 
} 

을하지만 그것은 당신의 구체적인 경우에 작동하지 않습니다.

+0

흠. 따라서 twitter doc stuff는 작성된대로 작동하지 않습니다. 그것들은 내가 간혹 코드를 들었던 부분 앞의 "간수들"을 매우 간략하게 설명합니다. 알려진 문제 인 것처럼 보입니다. https://github.com/twitter/scala_school/pull/89 –

+0

그게 전부입니다! 하지만 펑키. _을 "포착"할 필요가 나에게는 불필요한 것처럼 보입니다. 어쨌든. 그것은 컴파일하고 "새로운 반짝"에 대한 나의 이해가 향상되었습니다. –

관련 문제