Czy istnieje sposób określenia, czy podprogram jest wywoływany jako metoda (z sondowaniem @ISA), czy jako zwykły podprogram? Być może z jakimś modułem rozszerzenia super-caller()?W Perlu, w jaki sposób określić, czy podprogram został wywołany jako metoda?
Na przykład, biorąc pod uwagę
package Ad::Hoc;
sub func() { ... }
Jak func()
rozróżnienia między dwiema następującymi inwokacji:
Ad::Hoc->func; # or $obj->func
Ad::Hoc::func('Ad::Hoc'); # or func($obj)
(wiem, pragnienie, aby to zrobić jest Prawdopodobny Wskazanie słaby projekt ™.)
Ale musisz go użyć tylko wtedy, gdy metoda akceptuje zmienną liczbę argumentów. W przeciwnym razie możesz po prostu sprawdzić rozmiar '@ _'. – ikegami
+1 bardzo obiecujący. Dostaję fatalny błąd "pushmark lub pad", jeśli wypróbuję '$ blessed-> func' z' called_as_method() '(5.18.0, PadWalker-1.96, D :: Caller-2.06), ale wywołanie metody pakietowej działa doskonale, jak ilustrujesz powyżej. – pilcrow
@ikegami, zgodzili się. Jest to ciekawość techniczna wyrwana z problemu, który prawdopodobnie nie powinien był być dozwolony w pierwszej kolejności. – pilcrow