首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在不定义getter的情况下访问Perl包的ATTR?

是否可以在不定义getter的情况下访问Perl包的ATTR?
EN

Stack Overflow用户
提问于 2020-08-26 10:15:34
回答 1查看 107关注 0票数 3

我目前正在从事一个Perl5.8项目。我有一个包裹看起来像:

代码语言:javascript
复制
package Foo::Bar;

use strict;
use warnings;
use Class::Std;

our @EXPORT_SAFE = qw(Class::Std);

my %baz :ATTR;

sub BUILD {
  my ($self, $ident, $args) = @_;
  
  $baz{$ident} = $$args{something};
}

我不会用任何getter公开baz,但我想获取它的内容,以供单元测试之用。在Perl中有什么方法可以做到吗?

例如,在Ruby中,可以使用some_instance.instance_variable_get("@#{name}")

先谢谢你

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-26 10:40:29

TL;博士

在一般情况下,答案是“这取决于(但可能)”。

你的回答是“不”。

细节

在Perl中没有实现类和对象的固定方法。在大多数情况下,对象将是对散列的良好引用。在这些情况下,您可以简单地将对象引用视为哈希引用,并直接查找键。所以,这样的代码:

代码语言:javascript
复制
my $baz = $obj->{baz};

但是,您不是使用最常用的方法来构建Perl对象,而是使用类别::Std。和类::性病做的事情非常不同。类::Std使用了一种名为“内出对象”的方法,这种方法在面向对象Perl中由Damian Conway推广,在大约20年前非常流行。

在普通对象中,每个对象都有一个散列。键是属性名,值是属性值。对于内出对象,每个属性都有自己的散列。键是对单个对象的字符串引用,值是该对象的属性值。

实际上,“标准”办法是:

代码语言:javascript
复制
$object{attr} = value;

而内向外的方法是:

代码语言:javascript
复制
$attr{object} = value;

人们喜欢内置对象的主要原因之一是属性散列可以是存储在类源代码中的词法变量。这意味着它们确实是私有的,不能从类的外部访问--除非使用提供的访问器方法。如果您想要强制Perl实现一种更强大的封装,这是很棒的。但是如果你想用你在这里所做的方式来突破这种封装,那就太糟糕了。

所以,没有。在你的情况下你不能这么做。

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

https://stackoverflow.com/questions/63595446

复制
相关文章

相似问题

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