복붙노트

[SCALA] 소문자 변수 이름 스칼라 패턴 매칭

SCALA

소문자 변수 이름 스칼라 패턴 매칭

I는 (문자열) 대안으로 패턴 매칭을 사용하는 경우, 스칼라 (예 이하 MyValue1 및 MyValue2에서) 대문자로 시작하는 변수를 받아들이는 것을 발견하지만, 그 하부 케이스 (myValue1, myValue2)로 시작하지. 이 버그 또는 스칼라의 특징인가? 나는 버전 2.8이 얻을. 이 기능이 있으면, 사람이 뒤에 이론적 근거를 설명 할 수 있습니까? 이것은 내가 사용하는 코드입니다 :

val myValue1 = "hello"
val myValue2 = "world"
val MyValue1 = "hello"
val MyValue2 = "world"

var x:String = "test"

x match {
  case MyValue1 | MyValue2 => println ("first match")
  case myValue1 | myValue2 => println ("second match")
}

실행에, 나는 다음을 얻을 :

scala> val myValue1 = "hello"
myValue1: java.lang.String = hello

scala> val myValue2 = "world"
myValue2: java.lang.String = world

scala> val MyValue1 = "hello"
MyValue1: java.lang.String = hello

scala> val MyValue2 = "world"
MyValue2: java.lang.String = world

scala> var x:String = "test"
x: String = test

scala> x match {
 |   case MyValue1 | MyValue2 => println ("first match")
 |   case myValue1 | myValue2 => println ("second match")
 | }
<console>:11: error: illegal variable in pattern alternative
     case myValue1 | myValue2 => println ("second match")
          ^
<console>:11: error: illegal variable in pattern alternative
     case myValue1 | myValue2 => println ("second match")
                     ^

편집하다:

그것은 참으로 기능이 아니라 버그가 그래서 ... 캔 사람이 유용 할 수 있습니다 예를 제공?

때 내가 사용 :

x match {
   case myValue1 => println ("match")
   case _ => 
}

나는 첫 번째가 항상 일치하는 것을 의미, 마지막 경우에 도달 할 수없는 코드 경고를 얻을.

해결법

  1. ==============================

    1.이 대안과 패턴에 국한되지이며, 그것은 버그가 아닙니다. 패턴에서 소문자 문자로 시작하는 식별자는 패턴이 일치하는 경우 바인딩 할 수있는 새로운 변수를 나타냅니다.

    이 대안과 패턴에 국한되지이며, 그것은 버그가 아닙니다. 패턴에서 소문자 문자로 시작하는 식별자는 패턴이 일치하는 경우 바인딩 할 수있는 새로운 변수를 나타냅니다.

    따라서, 귀하의 예를 작성하는 것과 같습니다

    x match {
       case MyValue1 | MyValue2 => println ("first match")
       case y | z => println ("second match")
    }
    

    당신은 역 따옴표를 사용하여이 문제를 해결할 수 있습니다 :

    x match {
       case MyValue1 | MyValue2 => println ("first match")
       case `myValue1` | `myValue2` => println ("second match")
    }
    
  2. ==============================

    2.그것은 기능입니다. 대문자 문자로 시작 안정 식별자는 패턴 매칭을 목적으로 리터럴처럼 취급하고, 소문자 식별자는 "할당"당신은 뭔가 다른 일치하는 값을 사용할 수 있습니다.

    그것은 기능입니다. 대문자 문자로 시작 안정 식별자는 패턴 매칭을 목적으로 리터럴처럼 취급하고, 소문자 식별자는 "할당"당신은 뭔가 다른 일치하는 값을 사용할 수 있습니다.

    당신은 감각을하지 않는 예를했다 :

    x match {
       case myValue1 => println ("match")
       case _ => 
    }
    

    그러나 감각은 우리가 조금 것을 변경하면 쉽게 알 수있다 :

    x match {
       case MyValue1 => println("match")
       case MyValue2 => println("match")
       case other    => println("no match: "+other)
    }
    

    물론, 하나는 위의 X 대신 다른 사용할 수 있지만 여기에 편리되지 않을 것 몇 가지 예입니다 :

    (pattern findFirstIn text) {
        // "group1" and "group2" have been extracted, so were not available before
        case pattern(group1, group2) =>
    
        // "other" is the result of an expression, which you'd have to repeat otherwise
        case other =>
    }
    
    getAny match {
        // Here "s" is a already a string, whereas "getAny" would have to be typecast
        case s: String =>
    
        // Here "i" is a already an int, whereas "getAny" would have to be typecase
        case i: Int =>
    }
    

    이 식별자에 일치하는 값을 할당하는 패턴 매칭 편리 왜 이렇게 많은 이유가있다.

    나는 그렇게 미묘하고 독특한 때문에이 스칼라의 가장 큰 잘못된 기능의 하나라고 생각하지만 지금, 그 뒤에 논리는, 그 권장 스칼라 스타일, 상수는 낙타가 대문자로 시작 맡았다입니다 방법과 발스 동안 및 (도 정말 방법이있는) 낙타는 소문자 편지로 시작 맡았다이다 바르. 다른 할당 식별자가 (외부 환경에 정의 식별자 그림자있다)로 처리하는 동안 상수 자연적 리터럴로 취급되도록.

  3. ==============================

    3.여기에서 일어나는 것은 MyValue1 및 MyValue2이 값은 이전 선언 참조 안정 식별자로 간주되는 반면 myValue1 및 myValue2가 (즉, 값이 결합되어 새로운 변수의 정의에 일치되는) 가변 식별자로서 취급되고있는 점이다. 첫 번째 경우는 직관적으로 작동 왜 패턴 일치의 경우, 변수 식별자 따라서, 소문자로 시작해야합니다. 정확한 내용은 스칼라 언어 사양 (http://www.scala-lang.org/docu/files/ScalaReference.pdf)의 8.1 절을 참조하십시오.

    여기에서 일어나는 것은 MyValue1 및 MyValue2이 값은 이전 선언 참조 안정 식별자로 간주되는 반면 myValue1 및 myValue2가 (즉, 값이 결합되어 새로운 변수의 정의에 일치되는) 가변 식별자로서 취급되고있는 점이다. 첫 번째 경우는 직관적으로 작동 왜 패턴 일치의 경우, 변수 식별자 따라서, 소문자로 시작해야합니다. 정확한 내용은 스칼라 언어 사양 (http://www.scala-lang.org/docu/files/ScalaReference.pdf)의 8.1 절을 참조하십시오.

    약간 예를 변경하면, 당신은 변수 식별자를 볼 수 있습니다

    scala> x match {
     | case MyValue1 | MyValue2 => println ("first match")
     | case myValue1 => println (myValue1)
     | }
    test
    
  4. ==============================

    4.도움이된다면, 난 그냥 일주일이 주제에 대한 기사를 게시하거나 너무 @ http://asoftsea.tumblr.com/post/2102257493/magic-match-sticks-and-burnt-fingers

    도움이된다면, 난 그냥 일주일이 주제에 대한 기사를 게시하거나 너무 @ http://asoftsea.tumblr.com/post/2102257493/magic-match-sticks-and-burnt-fingers

  5. from https://stackoverflow.com/questions/4479474/scala-pattern-matching-with-lowercase-variable-name by cc-by-sa and MIT license