> Java > java지도 시간 > 본문

스칼라의 패턴 일치에 대한 간략한 토론

不言
풀어 주다: 2018-11-16 15:40:39
앞으로
2130명이 탐색했습니다.

이 글의 내용은 스칼라에서의 패턴 매칭에 대한 간략한 논의입니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

1. 스칼라 패턴 매칭

pattern 매칭은 스칼라의 매우 강력한 언어 기능이라고 할 수 있습니다. 물론 이것이 스칼라에만 있는 것은 아니지만, 그렇지 않습니다. 스칼라 언어가 되는 것을 방지하는 강력한 도구입니다.

scala의 패턴 일치는 다음과 유사합니다.

e match {
  case Pattern1 => do Something
  case Pattern2 if-clause => do others
  ...
}
로그인 후 복사

여기서 변수 e 뒤에는 일치 항목과 코드 블록이 옵니다. 여기서 각 사례는 가능한 일치 유형에 해당합니다. 일치가 성공하면 => 이후의 코드가 실행됩니다.

패턴 일치가 어떻게 작동하는지 보기 위해 좀 더 구체적인 예를 사용할 수 있습니다.

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와 약간 유사해 보이지만 실제로는 여전히 많은 Big가 있습니다. 차이점.

Java의 스위치를 예로 들어 보겠습니다. Java의 스위치는 몇 가지 기본 유형 일치만 수행한 다음 몇 가지 작업을 수행하고 반환 값이 없습니다.

Scala의 패턴 일치 일치는 값 일치 외에도 유형 일치도 훨씬 강력합니다.

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
}
로그인 후 복사

동시에 패턴 일치에는 위의 일치와 같이 단위를 반환하는 반환 값이 있습니다. 위 코드를 수정하여 문자열을 반환할 수도 있습니다.

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!"
}
로그인 후 복사

패턴 일치 반환 값은 첫 번째 일치 패턴의 코드 블록에 의해 결정된다는 점을 언급할 가치가 있습니다.

2. 패턴 매칭을 사용하는 이유

이것을 보면 패턴 매칭도 다른 것과 비슷하지 않을까요? 그렇다면 패턴 일치를 사용하는 이유는 무엇입니까?

우선, 패턴 매칭은 본질적으로 데이터 구조를 구조화하는 편리한 방법을 제공한다는 점을 이해해야 합니다. 스칼라를 예로 들면, 패턴 매칭은 실제로 스칼라의 추출기 기능을 사용하여 핸들러를 추출합니다. 실제로는 클래스의 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")
  }
로그인 후 복사

패턴 매칭의 본질을 이해하고 나면 실제로 else가 패턴 매칭의 일반적인 사용법일 뿐 전부는 아니라는 것을 알게 될 것입니다.

동시에 패턴 일치를 사용하면 서로 실제로 속하지 않는 두 가지를 분리할 수 있으며 코드를 더 쉽게 테스트할 수도 있습니다. 예를 들어 위의 일치 부분에 대한 코드를 다음과 같이 작성할 수 있습니다.

  val user: User = new FreeUser("Daniel")
  //将返回结果存在一个常量中
  val message = user match {
    case FreeUser(name) => "it match here" + name
    case _ => "not me"
  }
  //可以随意使用该常量,实现解耦
  println(message)
로그인 후 복사

이렇게 하면 코드에 더 많은 유연성이 제공되고 추가 작업이 더 편리해집니다.

가독성 측면에서 보면 if else 코드를 많이 사용하는 것이 의심할 여지 없이 더 보기 흉하지만, 패턴 일치를 사용하면 코드가 훨씬 간단하고 명확해지며 간결한 코드를 작성하기가 더 쉬워집니다. 읽다.

위 내용은 스칼라의 패턴 일치에 대한 간략한 토론의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:segmentfault.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿