각 필드마다 유효성 검사 규칙 집합이 다른 일련의 필드가 있습니다.perl 서브 루틴 참조
해시 - 참조의 유효성을 검사하기위한 서브 루틴 참조를 배치했습니다.
현재 내 생성자에 있지만 내 개인 생성자에서 그것을 내 보내고 싶습니다.
나는
sub new {
my $class = shift;
my $self = {@_};
$class = (ref($class)) ? ref $class : $class;
bless($self, $class);
$self->{Validations} = {
Field1 => {name => sub{$self->checkField1(@_);},args => [qw(a b c)]}
Field2 => {name => sub{$self->checkField2(@_);},args => {key1, val1}}
..
..
..
..
};
return $self;
}
지금 내 생성자에서 모든 유효성 검사 규칙을 먹고 싶어하고 내 검증을 통해 더 좋은 제어 할 수 있도록 다음과 같은 몇 가지 일을 할 아래로했을 유형 필드를 기반으로 규칙. (몇 가지 규칙이 분야의 한 세트에서 흔히 말해 난 그냥 필드의 값을 덮어 쓰기하여 다른 규칙에 대한 규칙을 덮어 쓸 수 있습니다.)
bless($self, $class);
$self->{Validations} = $self->_getValidation($self->{type});
return $self;
}
sub _getValidation{
my ($self,$type) = @_;
my $validation = {
Field1 => {name => sub {$self->checkField1(@_);}, args => {key1 => val1}},};
return $validation;
}
하지만 Can't use string ("") as a subroutine ref while "strict refs" in use at...
을 얻고 것은 아무도 말해 줄 수 왜 이런 행동이 하위 참조. 내 이름 키를 확인하면 null 또는 하위 {DUMMY}가됩니다.
한가지 더 여기에 추가 할 수있는, 내가 그것을했을 'Field1 => {name => sub {$ self-> checkField1 (@_);} 이런 식으로 언젠가는 개별 필드의 유효성을 검사해야하며'$ obj-> checkField1 ('string', @ args);'더 나은 방법으로 내 접근 방식을 바꿀 준비가되었습니다. – awake416
재미있는 일이 여기에서 발생했는데 아무런 문제없이 작동합니다. 실제로 Field1을 시작하는 키를 정의하고 생성 된 첫 번째 필드는 Field0입니다. (..하지만이 질문은 여전히 더 나은 접근을 위해 열려 있습니다. – awake416
유효성 검사는 속성에 넣는 객체마다 실제로 다릅니 까? 그렇지 않으면'$ self'를 캡처하기 만합니까? 당신이 할 필요가 없기 때문에 ... – hobbs