2018 년 46 주차 - 스칼라 입문 - 패턴 매 칭
6819 단어 scala
scala 는 자바 가 없 는 switch 문법 이지 만 더 강력 한 match 문법, 즉 패턴 매 칭 을 제공 합 니 다. match 문법 은 다음 과 같 습 니 다. 변수 명 match {case 값 = > 표현 식} 값 이 밑줄 이 라면 상기 모든 상황 에 만족 하지 않 는 기본 적 인 상황 처 리 를 표시 합 니 다. match 문법 에 서 는 하나의 case 분기 만 만족 하면 다음 case 가 지 를 계속 판단 하지 않 습 니 다. 이 점 은 자바 와 다 릅 니 다.break 로 인 한 bug 를 쓰 는 것 도 피 할 수 있 습 니 다.
예: 성적 평가
def judgeGrade(grade: String){
grade match{
case "A" => println("Excellent")
case "B" => println("Good")
case "C" => println("Just so so")
case _ => println("you need work harder")
}
}
패턴 매 칭 중 if 수위 사용
scala 의 패턴 매 칭 문법 은 케이스 후의 조건 판단 에서 하나의 값 만 제공 하 는 것 이 아니 라 값 뒤에 if 수 비 를 추가 하여 이중 여과 할 수 있다 는 특징 이 있 습 니 다. 예: 성적 평가 (업그레이드 버 전, 이름 에 따라 서로 다른 힌트 를 줄 수 있 습 니 다)
def judgeGrade(name:String, grade:String){
grade match{
case "A" => println(name+", you are excellent")
case "B" => println(name+", you are good")
case "C" if name == "jc" => println(name+", you are a good boy, come on")
case "C" => println(name+", you are just so so") // , jc
case _ => println("you need to work harder")
}
}
패턴 일치 에서 변수 할당
scala 의 패턴 매 칭 문법 은 패턴 이 일치 하 는 기본 상황, 밑줄 을 그 어 하나의 변수 이름 으로 바 꿀 수 있 습 니 다. 이때 패턴 매 칭 문법 은 일치 하 는 값 을 이 변수 에 부여 하여 뒤의 처리 문 에서 일치 하 는 값 을 사용 할 수 있 습 니 다. 예: 성적 평가 (업그레이드 판, 이름 에 따라 서로 다른 힌트 를 주 고 성적 을 가 져 올 수 있 습 니 다)
def judgeGrade(name:String, grade:String){
grade match{
case "A" => println(name+", you are excellent")
case "B" => println(name+", you are good")
case "C" => println(name+", you are just so so")
case _actualGrade if name == "jc" => println(name+", you are a good boy, come on, your grade is "+_actualGrade)
case _actualGrade => println("you need to work harder, your grade is"+_actualGrade)
}
}
형식 일치
scala 의 패턴 이 일치 하 는 강력 한 기능 중 하 나 는 바로 유형 을 직접 일치 시 킬 수 있다 는 것 이다.
예외 처리
import java.io_
def processException(){
e match{
case e1: IllegalArgumentException=> println("that has illegal arguments! exception is: "+e1)
case e2: FileNotFoundException=> println("can not find the file! exception is: "+e2)
case e3: IOException=> println("you got an IOException")
case _: Exception=>println("I have not idea what exception is")
}
}
위 에 있 는 '패턴 일치 값 일치' 와 비교 해 야 합 니 다. 차이 점 을 알 고 있 습 니 다. 일치 값 은 case 값 = > 표현 식 이 고 일치 하 는 유형 은 case 변수: 형식 = > 표현 식 입 니 다. 따라서 일치 하 는 유형 은 기본 값 으로 변 수 를 할당 할 수 있 습 니 다. 일치 하 는 값 은 밑줄 로 새로운 변 수 를 정의 해 야 합 니 다.
Array 와 List 모드 일치
Array 를 패턴 매 칭 합 니 다. 지정 한 요 소 를 가 진 배열 과 일치 할 수 있 습 니 다. 지정 한 요소 의 개 수 를 가 진 배열 입 니 다. 특정한 요소 로 시작 하 는 배열 을 지정 하여 List 를 패턴 매 칭 할 수 있 습 니 다. Array 와 유사 하지만 List 특유 의: 연산 자 가 필요 합 니 다.
예: 친구 에 게 인사
def greeting(peoples: Array[String]){
peoples match{
case Array("jc")=> println("Hi, jc!")
case Array(girl1, girl2, girl3)=> println("Hi, girls, nice to meet you. "+girl1+" and "+girl2+" and "+ girl3)
case Array("jc",_*)=> println("Hi, jc, please introduce your friends to me.")
case _=> println("hey guys, who are you!")
}
}
var a = Array("jc")
greeting(a)
a = Array("jc","jay","jack")
greeting(a)
a = Array("jc","jay","jack","john")
greeting(a)
a = Array("jay","jack","john","johnny")
greeting(a)
def greeting(peoples: List[String]){
peoples match{
case "jc"::Nil=> println("Hi, jc!")
case girl1::girl2::girl3::Nil=> println("Hi, girls, nice to meet you. "+girl1+" and "+girl2+" and "+girl3)
case "jc"::tail=> println("Hi, jc, please introduce your friends to me.")
case _=> println("hey guys, who are you!")
}
}
var a = List("jc")
greeting(a)
a = List("jc","jay","jack")
greeting(a)
a = List("jc","jay","jack","john")
greeting(a)
a = List("jay","jack","john","johnny")
greeting(a)
위의 두 가지 기능 은 모두 같 습 니 다. 케이스 문 구 는 각각 하나의 기능 입 니 다. jc 요소 만 있 고 3 개의 요소 의 집합, jc 요소 의 선두, 다른 상황 입 니 다.
case class 가 패턴 과 일치 합 니 다.
scala 는 특별한 피 로 를 제공 합 니 다. 바로 case class 의 클래스 를 사용 하 는 것 입 니 다. 이러한 종 류 를 샘플 류 라 고 합 니 다. 샘플 류 는 엄격 한 정의 의 자바 빈 과 유사 합 니 다. field 만 정의 하고 scala 에서 컴 파일 할 때 getter 와 setter 방법 을 자동 으로 제공 하지만 다른 방법 이 없습니다. 그 밖 에 scala 는 샘플 류 에 동반 대상, 즉 object 를 자동 으로 정의 하고 apply 방법 을 정의 합 니 다.이 apply 방법의 매개 변 수 는 주 구조 함수 의 매개 변수 와 마찬가지 로 병 은 사례 류 로 되 돌아 갑 니 다. 쉽게 말 하면 사례 류 는 정의 류 와 예화 류 의 문법 을 간소화 합 니 다.
학교 방송
class Person
case class Teacher(name:String, subject:String) extends Person
case class Student(name:String, classroom:String) extends Person
def broadcast(p: Person){
p match{
case Teacher(name, subject)=> println(" "+subject+" "+name+" ")
case Student(name, classroom)=> println(classroom+name+" ")
case _=>println(" ")
}
}
val t = Teacher(" "," ")
val s = Student(" "," ")
broadcast(t)
broadcast(s)
옵션 과 패턴 일치
scala 는 Option 이 라 고 하 는 특수 한 유형 이 있 습 니 다. Option 은 두 개의 값 이 있 습 니 다. 하 나 는 Some 이 고 값 이 있 는 것 을 의미 하 며 하 나 는 None 이 고 값 이 없 는 것 을 의미 합 니 다.
option 은 보통 패턴 매 칭 에 사 용 됩 니 다. 특정한 변수 가 값 이 있 는 지 없 는 지 판단 하 는 데 사 용 됩 니 다. 이것 은 null 에서 온 것 보다 더욱 의미 화 됩 니 다. 예: 성적 조회
val grades = Map("jc"->"A","jay"->"B","jack"->"M")
def getGrade(name:String){
var grade = grades.get(name)
grade match{
case Some(grade)=> println("Hi "+name+", your grade is "+grade)
case None=> println("Sorry "+name+", your grade is not in the system.")
}
}
getGrade("jc")
getGrade("jay")
getGrade("jack")
getGrade("john")
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JDK 11을 사용하여 NixOS에서 Play Framework 실행저는 NixOS로 전환하고 있으며 이에 대해 다소 기대하고 있습니다. 오늘 저는 sbt 설치 및 JDK 11로 다운그레이드를 포함하여 Play Framework 환경을 손쉽게 설치하고 실행할 수 있게 된 것을 축하합...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.