Czy można uzyskać wszystkie prawidłowe metody dla konkretnej klasy Perla?Czy można uzyskać wszystkie prawidłowe metody dla konkretnej klasy Perla?
Próbuję manipulować tabelą symboli klasy i uzyskać wszystkie jego metody. Zauważyłem, że mogę oddzielić podprocedury od podprogramów poprzez $obj->can($method)
, ale to nie robi dokładnie tego, co myślę, że robi.
następujące zwroty:
subroutine, Property, croak, Group, confess, carp, File
Jednak subroutine
nie jest to metoda, (tylko podprogram) i croak
, confess
, a były importowane do mojego pakietu.
Co naprawdę chcę wydrukować to:
Property,Group, File
Ale wezmę:
subroutine, Property,Group, File
Poniżej jest mój program:
#! /usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
my $sections = Section_group->new;
say join ", ", $sections->Sections;
package Section_group;
use Carp;
sub new {
return bless {}, shift;
}
sub Add {
my $self = shift;
my $section = shift;
}
sub Sections {
my $self = shift;
my @sections;
for my $symbol (keys %Section_group::) {
next if $symbol eq "new"; # This is a constructor
next if $symbol eq "Add"; # Not interested in this method
next if $symbol eq "Sections"; # This is it's own method
push @sections, $symbol if $self->can($symbol);
}
return wantarray ? @sections : \@sections;
}
sub subroutine {
my $param1 = shift;
my $param2 = shift;
}
sub Group {
my $self = shift;
my $section = shift;
}
sub File {
my $self = shift;
my $section = shift;
}
sub Property {
my $self = shift;
my $section = shift;
}
Z drugiej strony, czasami ludzie faktycznie importują metodę z innego pakietu (np. 'Use Exporter 'import';' w przeciwieństwie do '@ISA = qw (Exporter);'). – cjm
@cjm Oczywiście, ale domyślam się, że to nie zdarza się często i może nawet być antypaplanetem. Mamy nadzieję, że większość ludzi oddzieliła mentalnie programowanie proceduralne (z importowaniem) od OOP (co rozwiązuje wiele problemów związanych z przestrzenią nazw). Nie ma sposobu, aby dowiedzieć się, czy zaimportowany okręt podwodny miał być metodą, więc musi to być wystarczająco dobre. (Zaczekaj, może, jeśli mamy dostęp do atrybutu ': method' ...) – amon
_ To jest dość trywialne. Trywialny? Budujesz generatory tachionów w weekendy? Perldoc na ** svref_2object **: _ Zwraca referencję do dowolnej wartości Perla i zamienia odwołaną wartość na obiekt w odpowiedniej klasie pochodnej B :: OP lub B :: SV. Nie mam pojęcia, co to jest to mówi. Jednak to działa. Sądzę, że nadszedł czas, aby zagłębić się w wcześniej niedopasowane i poprawić nieco moją grę Perla. Albo to, albo naucz się Pythona. –