我希望一些属性(在这个上下文中这可能是错误的术语)是私有的,也就是说,只有内部对象使用-不能从外部读取或写入。
例如,考虑一些内部变量,它计算一组方法中任何一个方法被调用的次数。
我应该在哪里以及如何定义这样的变量?
发布于 2010-10-22 20:17:18
Moose::Manual::Attributes
显示了以下创建私有属性的方法:
has '_genetic_code' => (
is => 'ro',
lazy => 1,
builder => '_build_genetic_code',
init_arg => undef,
);
设置init_arg
意味着不能在构造函数中设置此属性。如果需要更新,请将其设置为rw
或添加writer
。
/I3az/
发布于 2012-01-28 20:01:26
我想你想要MooseX::Privacy。
perldoc告诉你所有你需要的--它为你的属性添加了一个新的特征,允许你声明它们是私有的或受保护的:
has config => (
is => 'rw',
isa => 'Some::Config',
traits => [qw/Private/],
);
发布于 2012-01-28 14:02:03
我还没能想出一个让Moose属性完全私有的方法。每当我使用has 'name' => (...);
创建一个属性时,它总是至少要被读取。对于我想要真正私有的项目,我在Moose包中使用标准的"my“变量。举个简单的例子,看看下面的模块"CountingObject.pm“。
package CountingObject;
use Moose;
my $cntr = 0;
sub add_one { $cntr++; }
sub get_count { return $cntr; }
1;
使用该模块的脚本不能直接访问$cntr变量。它们必须使用"add_one“和"get_count”方法作为与外部世界的接口。例如:
#!/usr/bin/perl
### Call and create
use CountingObject;
my $co = CountingObject->new();
### This works: prints 0
printf( "%s\n", $co->get_count() );
### This works to update $cntr through the method
for (1..10) { $co->add_one(); }
### This works: prints 10
printf( "%s\n", $co->get_count() );
### Direct access won't work. These would fail:
# say $cntr;
# say $co->cntr;
我是Moose的新手,但据我所知,这种方法提供了完全私有的变量。
https://stackoverflow.com/questions/3996503
复制相似问题