Scala 모드 일치에 대한 간단한 설명

3399 단어 scala패턴 일치
하나.scala 모드 일치(pattern matching)
pattern matching은 scala에서 매우 강한 언어 특성이라고 할 수 있다. 물론 이것은 scala만의 것이 아니지만 이것은 scala의 언어가 되는 데 방해가 되지 않는다.
scala의 pattern matching은 이와 유사하지만,

e match {
 case Pattern1 => do Something
 case Pattern2 if-clause => do others
 ...
}
그 중에서 변수 e 뒤에 match와 코드 블록이 연결되어 있으며, 각각case는 일치할 수 있는 유형에 대응하고, 일치에 성공하면 => 뒤에 있는 코드를 실행합니다.
우리는 구체적인 예를 들어 패턴이 어떻게 작동하는지 볼 수 있다.

case class Player(name: String, score: Int)
def printMessage(player: Player) = player match {
 case Player(_, score) if score > 100000 =>
  println("Get a job, dude!")
 case Player(name, _) =>
  println("Hey, $name, nice to see you again!")
}
다른 언어의 switch와 비슷해 보이지만 사실은 많이 다르다.
자바의 switch를 예로 들면 자바의 switch는 기본적인 유형의 일치만 하고 동작을 실행할 뿐 되돌아오는 값이 없습니다.
한편, scala의pattern matching match는 수치를 일치시킬 수 있을 뿐만 아니라 유형도 일치할 수 있을 정도로 강력하다.

def parseArgument(arg: String) = arg match {
  // 
  case "-h" | "--help" => displayHelp
  case "-v" | "--version" => displayVerion
  case whatever => unknownArgument(whatever)
}

def f(x: Any): String = x match {
  // 
  case i:Int => "integer: " + i
  case _:Double => "a double"
  case s:String => "I want to say " + s
}
동시에 pattern matching은 되돌아오는 값이 있습니다. 예를 들어 위의 match는 되돌아오는 단위입니다.위의 코드를 수정하여 문자열을 되돌릴 수도 있습니다.

case class Player(name: String, score: Int)
def message(player: Player) = player match {
 case Player(_, score) if score > 100000 =>
  "Get a job, dude!"
 case Player(name, _) =>
  "Hey, $name, nice to see you again!"
}
특히 pattern matching 반환값은 첫 번째 일치하는 모드의 코드 블록에 의해 결정됩니다.
2.왜 pattern matching을 써요?
여기 보시면 질문 하나 발견할 수 있습니다. 패턴 매칭은 ifelse와 차이가 많지 않습니까?그런데 왜 pattern matching을 사용해야 합니까?
우선 패턴 매칭은 본질적으로 편리한 해구(Destructuring) 데이터 구조를 제공하는 방식이라는 것을 알아야 한다. scala를 예로 들면pattern matching은 scala에서 추출기의 기능을 실용화했고 추출기는 사실상 클래스의 unapply() 방법이다.

trait User {
 def name: String
}
class FreeUser(val name: String) extends User
object FreeUser {
 // 
 def unapply(user: FreeUser): Option[String] = Some(user.name)
}

 val user: User = new FreeUser("Daniel")
 user match {
  case FreeUser(name) => println("it match here" + name)
  case _ => println("not me")
 }
패턴이 일치하는 본질을 알게 되면 사실ifelse는pattern matching의 전형적인 용법일 뿐이지만 전부는 아니다.
또한,pattern matching은 당신이 진정으로 서로에게 속하지 않는 두 가지를 결합시킬 수 있고, 당신의 코드를 더욱 쉽게 테스트할 수 있도록 합니다.예를 들어 위의 match 부분의 코드를 우리는 다음과 같이 쓸 수 있다.

 val user: User = new FreeUser("Daniel")
 // 
 val message = user match {
  case FreeUser(name) => "it match here" + name
  case _ => "not me"
 }
 // , 
 println(message)
이렇게 하면 코드에 더욱 많은 유연성을 부여할 뿐만 아니라 진일보한 조작도 더욱 편리하게 할 수 있다.
읽을 수 있는 측면에서 볼 때 많은ifelse 코드를 사용하는 것은 의심할 여지없이 보기 싫은 것이다. 만약patternmatching을 사용한다면 코드는 간결하고 뚜렷할 뿐만 아니라 간결한 코드는 더욱 쉽게 읽을 수 있다.
이상은 Scala 모드 매칭에 대한 상세한 내용입니다. scala 모드 매칭에 대한 더 많은 자료는 저희 다른 관련 글에 주목하세요!

좋은 웹페이지 즐겨찾기