@ Ответ qwrrty - это хорошее объяснение ситуации, но из комментариев у меня создается впечатление, что даже если Perl делает небольшое различие между методами класса и объекта, @JackXu будет как такое различие.
Если вы хотите сделать такое различие, то решение должно проверить $_[0]
, чтобы увидеть, является ли это объектом или строкой, и вести себя соответствующим образом (например, вызывать исключение, если метод объекта вызывается с именем класса в качестве первый параметр).
Существуют различные модули метод подписи, доступных на CPAN, которые делают это тупо легко сделать, вдоль линий:
package Foo;
method xxx (Object $self: Int $x) {
...;
}
Foo->xxx(1); # throws an error because "Foo" is not an object
я собираюсь сутенер мое собственное решение для такого рода вещи - Moops, который не только дает вам сигнатуры методов, но и ключевые слова для class
, role
и т. д. Частная причина для сутенерства здесь заключается в том, что благодаря поддержке «нескольких методов» вы даже можете создать метод класса и метод объекта с тем же назовите друг друга!
use Moops;
class Foo
{
multi method xxx (ClassName $class: Int $x) {
say "CLASS METHOD - value $x";
}
multi method xxx (Object $self: Int $x) {
say "OBJECT METHOD - value $x";
}
}
Foo->xxx(1);
my $foo = Foo->new;
$foo->xxx(2);
Я просто хочу знать, почему имя использование пакета можно назвать все методы в пакете, есть какой-либо метод объекта, поэтому пакет не может назвать это непосредственно – JackXu