문자열을 기준으로 길이를 제한하고 길이를 제한 할 수있는 유형을 만들고 싶습니다. 즉, 길이 범위가 매개 변수가되는 매개 변수가있는 형식입니다. 내 구현에서 원하는 무엇
:Type : Tiny를 사용하는 다른 유형의 매개 변수 유형 : Tiny
- 문자열 길이 범위에 대한 별도의 유형입니다.
- 사용하지 MooseX :: 유형 :: 파라미터 화
- 바로 arrayref와 유형을 parametrizing의 설탕, hashref NOT :
- 이 :
isa=>Varchar[1, 15]
- 하지 않음이 :
isa=>Varchar[{min=>1, max=>15,}]
- 이 :
내가 지금까지 가지고있는 것 :
파일 MyTypesTiny.pm
package MyTypesTiny;
use strict;
use warnings;
use Type::Library
-base,
-declare => qw(VarcharRange Varchar);
use Type::Utils -all;
use Types::Standard -types;
use MooseX::Types::Common::Numeric qw(PositiveOrZeroInt);
declare VarcharRange,
as HashRef [PositiveOrZeroInt],
where {
return 0 if (grep { $_ ne 'min' && $_ ne 'max' } keys %{$_});
return ($_->{min} <= $_->{max})
if (defined $_->{max} && defined $_->{min});
return 1;
}, message { "$_" };
coerce VarcharRange, from ArrayRef [PositiveOrZeroInt], via {
my $result;
my @keys = qw(min max);
foreach my $val (reverse @$_) {
my $key = pop @keys // 'bad_range';
$result->{$key} = $val;
}
return $result;
};
1;
#!/usr/bin/env perl
package MyClass;
use Moose;
use MyTypesTiny qw(VarcharRange);
has 'my_range' => (isa=>VarcharRange, is=>'ro', coerce=>1);
package main;
use MyClass;
my $check = MyClass->new(
my_range => [1, 15], # works, as expected
# my_range => [1, 0], # fails, as expected
# my_range => [0, 1, 2], # fails, as expected
);
확인 파일 test_varchar.pl, VarcharRange 작동합니다. 이제 Varchar 자체를 추가해야합니다. 나는 즉시 박히 곳 그리고는 다음과 같습니다
는 MyTypesTiny.pm에 추가 :
declare Varchar, as Str, where {}, constraint_generator => sub {
# here I have @_ which is an ArrayRef
# and I want to create a VarcharRange object $range from it
# but what exactly should I do?
return sub {
my $len = length($_);
return 0 if ($range->{min} && $len < $range->{min});
return 0 if ($range->{max} && $len > $range->{max});
return 1;
};
};
내 뇌가 비등합니다. ArrayRef를 준비했습니다. 필요한 것은 VarcharRange (기본적으로 HashRef) 객체입니다. 그러나 VarcharRange는 유형이며 제한 및 강제 규칙 집합을 표시하는 이름입니다. 그것은 본질적으로 대상과 일치하지 않습니다. 유형에 대한 객체는 클래스 속성을 만들 때 만들어 지지만 여기서 어떤 클래스도 사용하지 않습니다.
포기하지 않으십니까? : D – simbabque
'VarcharRange'와'Varchar' 사이의 연결이 보이지 않습니다. – simbabque
'Varchar' 코드 안에 주석 처리 된 행을 보라. 본질적으로, ArrayRef에 의해'Varchar'를 매개 변수화할 때, 실제로, 두껍게, VarcharRange (ArrayRef로부터 강요받을 수 있습니다)에 의해'Varchar'를 매개 변수화하려고합니다. – Bob