: 당신은, 그러나, 특정로 선언하는 것이 더 구체적으로 할 수
has steps => (is => 'ro', isa => 'HashRef');
을 해당 슬롯에 저장된 것을 확인하는 방법으로 저장해야 해시의 종류는 일의 오른쪽 종류 :
has steps => (is => 'ro', isa => 'HashRef[HashRef[Object]]');
데이터에 따라, 나는 또한 클래스 이름에 여기 Object
변경 될 수 있습니다. 훨씬 더 까다로운 구조를 지정하기 위해서는 더 좋아질 수 있고 MooseX::Types 및 MooseX::Types::Structured을 사용할 수 있습니다.
도우미가 구조를 단계적으로 수행하는 데있어 Moose 또는 MooseX에서 아무 것도하지 않습니다. 데이터 구조를 아는 경우 자신이 필요로하는 것을 수행하기 위해 서브 루틴을 구현하는 것이 가장 좋습니다. 코드가 더 잘 수행되고 일반적인 트래버스보다 더 잘 수행 할 수 있습니다.
편집/추가 정보 : 각 무스 특성 때문에 데이터가 접근, 접근 방법을 저장된 값을 반환 어떤 클래스를 생성하지 :
# Assuming we put the attribute in a package named StepTool
my $step_tool = StepTool->new(
steps => { 'step1' => {'extraction' => \$object1,
'analysis' => \$object2},
'step2' => {'extraction' => \$object3,
'analysis' => \$object4} },
);
# To do something one of the values
do_something($step_tool->steps->{step1}{extraction});
# To iterate over the structure, could be done in a method on StepTool
for my $step_name (keys %{ $step_tool->steps }) {
my $step = $step_tool->steps->{ $step_name };
for my $action_name (keys %$step) {
my $object = $step->{ $action_name };
do_something($object);
}
}
# If doing the above as a method, $self is the Moose object, so...
sub traverse_steps {
my ($self) = @_;
for my $step_name (keys %{ $self->steps }) {
... # just like above
}
}
그리고 다른 한 노트, 당신은 여전히 traits => [ 'Hash' ]
을 사용할 수 있습니다 원하는 경우 일부 핸들을 추가하여 몇 가지 추가 도우미를 제공 할 수 있습니다.
데이터 구조가 이보다 더 자유로운 양식 인 경우 Data::Visitor과 같은 것을 조사하여 서브 루틴의 구조를 반복 할 수 있습니다. (나는 데이터 :: 방문자와 이상한 문제는, 디버그에 약간의 어려움이 있었다, 그래서 나는 때 내가 할 수있는 그것을 피하려고.)
그리고 난이'$ 대상 - 같은 뭔가를해야이> 단계에 액세스 할 수() -> { '1 단계} -> {'추출 '}'? 하지만 그때 나는 가치로 변할 수 있니? – user1571117
위의 편집이 도움이됩니까? – zostay
네, 고맙습니다. – user1571117