다음 기능을 사용하십시오.
def fMatch(s: String) = {
s match {
case "a" => println("It was a")
case _ => println("It was something else")
}
}
이 패턴은 잘 어울립니다.
scala> fMatch("a")
It was a
scala> fMatch("b")
It was something else
내가 할 수있는 것은 다음과 같습니다.
def mMatch(s: String) = {
val target: String = "a"
s match {
case target => println("It was" + target)
case _ => println("It was something else")
}
}
이로 인해 다음 오류가 발생합니다.
fMatch: (s: String)Unit
<console>:12: error: unreachable code
case _ => println("It was something else")
타겟이 실제로 입력이 무엇이든 할당하고 싶은 이름이라고 생각하기 때문이라고 생각합니다. 두 가지 질문 :
-
왜 이런 행동입니까? 적절한 유형을 가진 범위에서 기존 변수를 찾아서 먼저 사용하고 아무것도 발견되지 않으면 대상을 패턴 일치 이름으로 취급 할 수 없습니까?
-
이에 대한 해결 방법이 있습니까? 변수에 대한 패턴 일치 방법이 있습니까? 궁극적으로 큰 if 문을 사용할 수 있지만 대소 문자 구분이 더 우아합니다.
답변
당신이 찾고있는 것은 안정적인 식별자 입니다. Scala에서는 대문자로 시작하거나 백틱으로 둘러싸 야합니다.
이 두 가지 모두 문제에 대한 해결책이 될 것입니다.
def mMatch(s: String) = {
val target: String = "a"
s match {
case `target` => println("It was" + target)
case _ => println("It was something else")
}
}
def mMatch2(s: String) = {
val Target: String = "a"
s match {
case Target => println("It was" + Target)
case _ => println("It was something else")
}
}
둘러싸는 범위에 이미 존재하는 변수를 우연히 참조하지 않으려면 기본 동작이 소문자 패턴이 안정적인 식별자가 아닌 변수 인 것이 합리적이라고 생각합니다. 대문자로 시작하거나 백틱으로 시작하는 것을 볼 때만 주변 범위에서 비롯된다는 점을 인식해야합니다.