首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何创建内部(私有) Moose对象变量(属性)?

如何创建内部(私有) Moose对象变量(属性)?
EN

Stack Overflow用户
提问于 2010-10-22 19:52:18
回答 4查看 6.2K关注 0票数 19

我希望一些属性(在这个上下文中这可能是错误的术语)是私有的,也就是说,只有内部对象使用-不能从外部读取或写入。

例如,考虑一些内部变量,它计算一组方法中任何一个方法被调用的次数。

我应该在哪里以及如何定义这样的变量?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-22 20:17:18

Moose::Manual::Attributes显示了以下创建私有属性的方法:

代码语言:javascript
复制
has '_genetic_code' => (
   is       => 'ro',
   lazy     => 1,
   builder  => '_build_genetic_code',
   init_arg => undef,
);

设置init_arg意味着不能在构造函数中设置此属性。如果需要更新,请将其设置为rw或添加writer

/I3az/

票数 15
EN

Stack Overflow用户

发布于 2012-01-28 20:01:26

我想你想要MooseX::Privacy

perldoc告诉你所有你需要的--它为你的属性添加了一个新的特征,允许你声明它们是私有的或受保护的:

代码语言:javascript
复制
has config => (
    is     => 'rw',
    isa    => 'Some::Config',
    traits => [qw/Private/],
);
票数 7
EN

Stack Overflow用户

发布于 2012-01-28 14:02:03

我还没能想出一个让Moose属性完全私有的方法。每当我使用has 'name' => (...);创建一个属性时,它总是至少要被读取。对于我想要真正私有的项目,我在Moose包中使用标准的"my“变量。举个简单的例子,看看下面的模块"CountingObject.pm“。

代码语言:javascript
复制
package CountingObject;

use Moose;

my $cntr = 0;

sub add_one { $cntr++; }

sub get_count { return $cntr; }

1;

使用该模块的脚本不能直接访问$cntr变量。它们必须使用"add_one“和"get_count”方法作为与外部世界的接口。例如:

代码语言:javascript
复制
#!/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的新手,但据我所知,这种方法提供了完全私有的变量。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3996503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档