[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.이 대안과 패턴에 국한되지이며, 그것은 버그가 아닙니다. 패턴에서 소문자 문자로 시작하는 식별자는 패턴이 일치하는 경우 바인딩 할 수있는 새로운 변수를 나타냅니다.
이 대안과 패턴에 국한되지이며, 그것은 버그가 아닙니다. 패턴에서 소문자 문자로 시작하는 식별자는 패턴이 일치하는 경우 바인딩 할 수있는 새로운 변수를 나타냅니다.
따라서, 귀하의 예를 작성하는 것과 같습니다
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.그것은 기능입니다. 대문자 문자로 시작 안정 식별자는 패턴 매칭을 목적으로 리터럴처럼 취급하고, 소문자 식별자는 "할당"당신은 뭔가 다른 일치하는 값을 사용할 수 있습니다.
그것은 기능입니다. 대문자 문자로 시작 안정 식별자는 패턴 매칭을 목적으로 리터럴처럼 취급하고, 소문자 식별자는 "할당"당신은 뭔가 다른 일치하는 값을 사용할 수 있습니다.
당신은 감각을하지 않는 예를했다 :
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.여기에서 일어나는 것은 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.도움이된다면, 난 그냥 일주일이 주제에 대한 기사를 게시하거나 너무 @ http://asoftsea.tumblr.com/post/2102257493/magic-match-sticks-and-burnt-fingers
도움이된다면, 난 그냥 일주일이 주제에 대한 기사를 게시하거나 너무 @ http://asoftsea.tumblr.com/post/2102257493/magic-match-sticks-and-burnt-fingers
from https://stackoverflow.com/questions/4479474/scala-pattern-matching-with-lowercase-variable-name by cc-by-sa and MIT license
'SCALA' 카테고리의 다른 글
[SCALA] 스칼라 : 암시 적 매개 변수 해상도 우선 순위 (0) | 2019.11.09 |
---|---|
[SCALA] 어떻게 가변 인자와없는 방법 사이 스칼라에서 명확하게 않는다 (0) | 2019.11.09 |
[SCALA] 스파크 DataFrame에 널 (null) 값을 교체 (0) | 2019.11.09 |
[SCALA] 어떤 구성 설정은 키 'akka.version'을 찾을 수 없습니다 (0) | 2019.11.09 |
[SCALA] 표준 작업 이후에 자동으로 실행 사용자 지정 작업 / (0) | 2019.11.09 |