如何从同一个包中访问Perl中的对象功能

dgB*_*gBP 1 oop perl module object

我正在制作一个Perl模块,我仍然在研究Perl如何处理对象.这是new我写的用于创建对象的子,我没有更新元素的问题:

sub new {
    my $class = shift;
    my ($self) = {
        name => undef
    };
    bless($self, $class);
    return $self;
}
sub get_name {
    my $self = shift;
    $self->{name} = 'Eve';
    return $self->{name};
}
Run Code Online (Sandbox Code Playgroud)

当我调用模块并从另一个文件访问它时,我可以使用该对象,但我想在模块代码中的其他区域使用对象中的数据.

所以我这样做没有问题:

my $new_object = new ProgramTest; # ProgramTest being the module/package
my $name = get_name();
Run Code Online (Sandbox Code Playgroud)

但是我想$self在"模块内部"方法中使用元素,这种方法永远不会被外部脚本访问.所以我想要这样的东西:

sub get_variables {
    return (name); # I don't know how to get the name here 
    # (I plan to have other variables, too)
}
Run Code Online (Sandbox Code Playgroud)

我可能错过了一些明显的东西(我确信当我看到解决方案时我会踢自己),所以任何帮助都表示赞赏!我希望这样,以便模块的其余部分可以使用变量(不更改),因为有条件依赖于它们的值.

ber*_*rdt 6

Perl对象中没有内部/私有方法.通常的做法是启动任何不应与下划线一起公开使用的方法,但这不会以任何方式强制执行.还要看看驼鹿 - 它需要很多OO perl的麻烦.

关于您的问题,下面显示了一个模块方法如何调用另一个模块方法,两者都可以访问对象数据.我真的会建议你使用驼鹿!

sub publicSub{
    my ( $self ) = @_;

    return $self->_privateSub();
}

sub _privateSub{
    my ( $self ) = @_;

    return $self->{name};
}
Run Code Online (Sandbox Code Playgroud)

  • `$ self`总是拥有受祝福的对象本身.如果你在`$ obj-> do($ stuff)`之类的对象上调用一个方法,那么` - >`使得Perl使用`$ obj`作为`do`子的第一个参数,因此它需要`my( $ self,$ stuff)= @ _`.您可以使用内部方法执行相同的操作.请注意,您**也可以使用`do($ obj,$ stuff)`显式调用方法.这是有效的,但看起来很难看,没有人会明白你在做什么,所以**不要这样做**. (3认同)

sim*_*que 5

我想你想要类变量.它们是类的全局,类的所有实例(即您创建的所有对象)都可以看到它们.在这种情况下,全局意味着它们处于最左侧的词汇范围,因此所有潜艇都可以看到它们.

package ProgramTest;
my $everyone_can_see_this = 1; # lexical scope, but 'global' to the package

sub new {
    my $class = shift;
    my ($self) = {
        name => undef
    };
    bless($self, $class);
    return $self;
}
sub get_var {
    my $self = shift;
    return ++$everyone_can_see_this;
}

package Main;
my $o1 = ProgramTest->new;
my $o2 = ProgramTest->new;

say $o1->get_var;
say $o2->get_var;
say $o1->get_var;

__END__
2
3
4
Run Code Online (Sandbox Code Playgroud)

但我不明白你为什么要那样做.它没有意义(除非你想要一个对象计数器).不要将它用于配置值,或者您不能将对象用于同一类的不同目的.

也许你想要别的东西.如果是这样,请尝试重新解释您的问题.