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

Dav*_*d B 18 perl moose

我想要一些属性(也许这是在这种情况下这是错误的术语)是私有的,也就是说,只有内部用于对象使用 - 不能从外部读取或写入.

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

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

dra*_*tun 15

Moose::Manual::Attributes节目通过以下方式创建私有属性:

has '_genetic_code' => (
   is       => 'ro',
   lazy     => 1,
   builder  => '_build_genetic_code',
   init_arg => undef,
);
Run Code Online (Sandbox Code Playgroud)

设置init_arg意味着无法在构造函数中设置此属性.如果您需要更新它,请将其设为rw或添加writer.

/ I3az /

  • 这个问题涉及阅读和写作.据我所知,在2012年1月的Moose版本(2.0401)中,以这种方式制作的属性仍然可以从对象本身外部读取.例如,`my $ m = MooseObject-> new(); print $ m - > _ genetic_code;`将打印存储在属性中的任何内容.我不知道是否有办法解决这个问题.它从来没有打扰过我,但我认为值得一提. (3认同)

小智 10

你可以尝试这样的事情:

has 'call_counter' => (
    is     => 'ro',
    writer => '_set_call_counter',
);
Run Code Online (Sandbox Code Playgroud)

is => 'ro'使该属性只读.穆斯产生一个吸气剂.您的方法将使用getter来增加值,如下所示:

sub called {
    my $self = shift;
    $self->_set_call_counter( $self->call_counter + 1 );
    ...
}
Run Code Online (Sandbox Code Playgroud)

writer => '_set_call_counter'生成一个名为的setter _set_call_counter.Moose不支持真正的私有属性.从技术上讲,外部代码可以调用_set_call_counter.但是,按照惯例,应用程序不会调用以下划线开头的方法.

  • *Moose*本身不支持私有属性.Perl非常乐意使用例如基于自然闭包的实例类型来支持它们.在大多数用例中,你必须跳过才能使它们工作的箍是不值得的.借口迂腐. (3认同)
  • 隐私是关于数据隐藏,而不是数据安全.Perl不支持真正的私有属性,因为您可以直接访问属性.我只想指出,如果你只能间接访问它们,那将是另一个故事...... (2认同)

and*_*urd 7

我想你想要MooseX :: Privacy.

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

has config => (
    is     => 'rw',
    isa    => 'Some::Config',
    traits => [qw/Private/],
);
Run Code Online (Sandbox Code Playgroud)