유형::Tiny v2 출시 예정

19247 단어 perlannouncementsnews
CPAN을 예리하게 관찰하는 사람들은 내가 최근에 버전 번호 1.999_XYZ로 Type::Tiny 개발 릴리스를 릴리스하고 있음을 알아차렸을 것입니다.

Type::Tiny v2는 Type::Tiny v1과 호환됩니다. Type::Tiny v1을 사용한 경우 코드를 변경할 필요가 없지만 Type::Tiny v2에는 코드를 채택하면 코드를 더 단순하고 유지 관리하기 쉽고 읽기 쉽게 만드는 몇 가지 새로운 기능이 있습니다.

유형::Params v2 API



Type::Params는 유형이 지정된 서브루틴 서명을 제공하는 데 사용할 수 있습니다.

   use feature qw( state );
   use Type::Params qw( compile );
   use Types::Standard qw( Num );

   sub add_numbers {
      state $signature = compile( Num, Num );
      my ( $x, $y ) = $signature->( @_ );

      return $x + $y;
   }


그러나 이름이 지정된 매개변수, 메서드에서 $self에 대한 케이터링 등과 같은 것은 나중에 생각하는 것처럼 느껴졌습니다. 명명된 매개 변수를 사용하여 메서드 호출로 버전 1에서 동일한 서명을 작성하는 방법은 다음과 같습니다.

   use feature qw( state );
   use Type::Params qw( compile_named_oo );
   use Types::Standard qw( Num );

   sub add_numbers {
      state $signature = compile_named_oo(
         { head => [ Any ] },
         'x' => Num,
         'y' => Num,
      );
      my ( $self, $arg ) = $signature->( @_ );

      return $arg->x + $arg->y;
   }


이전 API는 계속 지원되지만 Type::Params v2에는 signaturesignature_for 의 두 가지 새로운 기능이 있어 더 강력하고 일관된 인터페이스를 제공한다고 생각합니다.
signaturecompile 와 거의 동일하게 작동하지만 옵션의 최상위 해시를 사용하여 위치 및 명명된 매개변수를 모두 수용할 수 있습니다.

다음은 위치 매개변수의 예입니다.

   use feature qw( state );
   use Type::Params qw( signature );
   use Types::Standard qw( Num );

   sub add_numbers {
      state $signature = signature(
         method     => 0,
         positional => [ Num, Num ],
      );
      my ( $x, $y ) = $signature->( @_ );

      return $x + $y;
   }


다음은 명명된 매개변수의 예입니다.

   use feature qw( state );
   use Type::Params qw( signature );
   use Types::Standard qw( Num );

   sub add_numbers {
      state $signature = signature(
         method     => 1,
         named      => [ 'x' => Num, 'y' => Num ],
      );
      my ( $self, $arg ) = $signature->( @_ );

      return $arg->x + $arg->y;
   }


그리고 signature_for를 사용하면 해당 정의를 뒤집을 수 있습니다.

   use experimental qw( signatures );
   use Type::Params qw( signature_for );
   use Types::Standard qw( Num );

   signature_for add_numbers => (
      method     => 1,
      named      => [ 'x' => Num, 'y' => Num ],
   );

   sub add_numbers ( $self, $arg ) {
      return $arg->x + $arg->y;
   }


편리한 가져오기 단축키



Type::Tiny 2에서 Enum 유형을 정의하는 편리한 방법은 다음과 같습니다.

   use Type::Tiny::Enum Size => [ qw( S M L XL ) ];


다음과 같은 클래스에서 사용할 수 있습니다.

   package Local::TShirt {
      use Moose;
      use Types::Common -types;
      use Type::Tiny::Enum Size => [ qw( S M L XL ) ];
      use namespace::autoclean;

      has size => (
         is        => 'ro',
         isa       => Size,
         required  => 1,
      );

      sub price {
         my $self = shift;
         my $size = $self->size;

         if ( $size eq SIZE_XL ) {
            return 10.99;
         }
         elsif ( $size eq SIZE_L ) {
            return 9.99;
         }
         else {
            return 8.99;
         }
      }
   }


예, Enum 유형 제약 조건은 이제 위의 SIZE_XL와 같은 상수를 제공합니다.

Type::Tiny::Class는 비슷한 단축키를 제공합니다.

   sub post_data ( $url, $data, $ua=undef ) {

      use Type::Tiny::Class -lexical, 'HTTP::Tiny';

      $ua = HTTPTiny->new unless is_HTTPTiny $ua;
      $ua->post( $url, $data );
   }


Type::Tiny::Role 및 Type::Tiny::Duck도 바로 가기를 제공합니다.

유형::일반



Type::Tiny를 사용하는 많은 모듈을 확인한 결과 사람들이 임포트하는 가장 일반적인 모듈이 Types::Standard, Type::Params, Types::Common::Numeric 및 Types::Common임을 알게 되었습니다.::끈.

Types::Common은 위의 모든 것을 결합한 새로운 모듈입니다. 빠른 스크립트 및 한 줄짜리의 경우 다음과 같이 입력하면 약간의 입력이 절약될 수 있습니다.

   use Types::Common -all;


항상 그렇듯이 가져오기를 명시적으로 나열할 수 있습니다.

   use Types::Common qw( signature_for Num NonEmptyStr );


최첨단 Perl이 설치되어 있는 경우 함수를 어휘적으로 가져올 수 있습니다.

   use Types::Common -lexical, -all;


스스로 갈라진 전형이 서리라



이제 유형 제약 조건을 다른 제약 조건으로 나눌 수 있습니다.

   has lucky_numbers => (
      is    => 'ro',
      isa   => ArrayRef[ Num / Any ],
   );


이것은 무엇을 의미 하는가?

정상적인 상황에서 Num/Any는 Any로 평가됩니다. Num은 기본적으로 문서일 뿐이므로 lucky_numbers가 숫자의 arrayref가 되도록 의도된 것임을 문서화하고 있지만 속도 향상을 위해 속성은 그것이 어떤 것의 arrayref인지 확인합니다.
EXTENDED_TESTING 환경 변수가 켜져 있으면 Num/Any는 Num으로 평가되므로 보다 엄격한 유형 검사가 시작됩니다.

유형 기본값



대신:

   has output_list => (
      is        => 'ro',
      isa       => ArrayRef,
      default   => sub { [] },
   );


이제 다음과 같이 작성할 수 있습니다.

   has output_list => (
      is        => 'ro',
      isa       => ArrayRef,
      default   => ArrayRef->type_default,
   );


이것은 더 많은 타이핑인데 왜 이것을합니까? 음, ArrayRef의 경우 타이핑이 더 많을 수 있지만 이 경우에는 다음과 같습니다.

   has colour_scheme => (
      is        => 'ro',
      isa       => ColourScheme,
      default   => sub {
         my %colours = (
            foreground => 'black',
            background => 'white',
            links      => 'blue',
            highlight  => 'red',
         );
         return \%colours;
      },
   );


ColourScheme 유형의 정의에 기본값을 포함하는 것이 더 깔끔할 수 있습니다.

새로운 DelimitedStr 유형



Types::Common::String은 이제 DelimitedStr 유형을 가집니다.

이렇게 하면 DelimitedStr[ "|", Int ] 와 같은 문자열을 허용할 수 있습니다 "12|34|-99|0|1" .

내부



Type::Tiny v2에는 수많은 내부 리팩토링이 있으므로 Type::Tiny 및 관련 모듈을 좀 더 비정통적인 방식으로 사용하는 경우 코드가 여전히 새 버전에서 실행되는지 명시적으로 테스트할 가치가 있습니다.

그러나 문서화된 API를 위반하지 않도록 주의했습니다. 대부분의 Type:Tiny v1 테스트 스위트는 여전히 Type::Tiny v2를 통과하며 오류 메시지의 정확한 텍스트를 검사하는 테스트 케이스가 유일한 실제 변경 사항입니다.

좋은 웹페이지 즐겨찾기