유형::Tiny v2 출시 예정
19247 단어 perlannouncementsnews
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에는
signature
및 signature_for
의 두 가지 새로운 기능이 있어 더 강력하고 일관된 인터페이스를 제공한다고 생각합니다.signature
는 compile
와 거의 동일하게 작동하지만 옵션의 최상위 해시를 사용하여 위치 및 명명된 매개변수를 모두 수용할 수 있습니다.다음은 위치 매개변수의 예입니다.
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를 통과하며 오류 메시지의 정확한 텍스트를 검사하는 테스트 케이스가 유일한 실제 변경 사항입니다.
Reference
이 문제에 관하여(유형::Tiny v2 출시 예정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/tobyink/typetiny-v2-is-coming-4171텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)