C# 6 및 VB 12에 패턴 일치 기능이 추가될 예정입니다.

伊谢尔伦
풀어 주다: 2016-11-24 11:58:38
원래의
1067명이 탐색했습니다.

함수형 프로그래밍 언어에서 유래한 또 다른 개념이 C#과 VB 진영에 합류했는데, 바로 패턴 매칭(Pattern Matching)이라는 기능입니다. 언뜻 보기에 패턴 일치는 스위치/선택 문 블록처럼 작동하지만 그 기능은 훨씬 더 강력합니다.

참고: VB 버전 사양이 아직 완성되지 않았으므로 이러한 예제는 주로 C#의 패턴 일치 사양에서 가져온 것입니다.

is 또는 Matches 연산자

.NET의 패턴 일치는 주로 "is/Matches" 연산자를 통해 지원됩니다. 이 덜 친숙한 연산자는 클래스를 구성 요소 부분으로 나눕니다. 다음 예는 화요일 뉴스 보도에 언급된 데카르트 레코드 클래스 http://www.infoq.com/news/2014/08/Record-Class(레코드 클래스)를 기반으로 합니다.

public static bool operator is(Cartesian c, out double x, out double y)
    x = c.X;
    y = c.Y;
    return true;
}
로그인 후 복사

이 연산자는 정의 클래스에서만 사용하도록 제한되지 않습니다. 다음 예에서는 연산자를 다른 방식으로 정의하여 데카르트 객체를 분해하고 Polar 객체와 일치시킬 수 있도록 합니다.

public static class Polar {
    public static bool operator is( Cartesian c, out double R, out double Theta)
   {
        R = Math.Sqrt(c.X*c.X + c.Y*c.Y);
        Theta = Math.Atan2(c.Y, c.X);
        return c.X != 0 || c.Y != 0;
   }
}
var c = Cartesian(3, 4);
if (c is Polar(var R, *))
   Console.WriteLine(R);
로그인 후 복사

유형 패턴

가장 간단한 패턴은 유형 변환을 수행하는 동시에 이를 변수에 할당하려고 시도하는 유형 패턴입니다. 다음은 그러한 패턴의 예입니다.

if (expr is Type v)
   { // code using v }
로그인 후 복사

재귀 패턴

대부분의 패턴은 재귀 패턴으로 나타납니다. 즉, 더 간단한 패턴으로 구성되어 있다는 뜻입니다. 이 패턴의 예를 살펴보십시오.

var a = new Location(1, 2, 3); //x=1, y=2, z=3
if (a is Location(1, var y, *))
로그인 후 복사

이 재귀 패턴에는 상수 패턴, var 패턴 및 와일드카드 패턴이 포함됩니다.

상수 모드

이 모드는 속성을 상수 값과 일치시킬 수 있습니다. 상수 일치는 object.Equals(left, right) 메소드를 사용하여 둘이 일치하는지 확인합니다.

Var 모드

Var 모드는 확실히 성공적으로 일치합니다. 이 모드에 해당하는 변수에는 is 연산자를 호출할 때 제공된 값이 할당되며 변수 유형은 정적 유형입니다. 이 표현으로 결정됩니다.

와일드카드 패턴

와일드카드 패턴은 기본적으로 var 표현식이지만 일치 결과에 신경 쓸 필요가 없습니다.

내부 구현

이 위치 클래스의 예를 계속 논의해 보겠습니다. 컴파일러는 컴파일 단계에서 다음 단계를 수행합니다.

$x, $ 변수 만들기 y 및 $z

Location.is(a, out $x, out $y, out $z) 메소드를 호출하고 반환 결과가 true인지 확인하세요

상수 모드: 개체 확인 . Equals($x, 1) 호출 결과

Var 모드: $y를 y에 할당

와일드카드 모드: $z 변수 무시

Case 문 블록 전환/선택

Switch 문 블록의 기능이 확장되어 패턴 매칭 기능을 사용할 수 있게 됩니다. 이것이 실제로 의미하는 바는 다음과 같이 명령문을 작성할 수 있다는 것입니다.

case null:
case String s
case Location(1, var y, *):
로그인 후 복사

限制

  在目前的规格草稿中,还没有对于范围检查的支持。这意味着你不能编写类似于“a is Location( > 0, 1 to 5, <= 10)”这样的代码。此外目前也不支持在一个列表或迭代器中进行元素匹配。


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