我目前正在从事一个Perl5.8项目。我有一个包裹看起来像:
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}")
先谢谢你
发布于 2020-08-26 10:40:29
TL;博士
在一般情况下,答案是“这取决于(但可能)”。
你的回答是“不”。
细节
在Perl中没有实现类和对象的固定方法。在大多数情况下,对象将是对散列的良好引用。在这些情况下,您可以简单地将对象引用视为哈希引用,并直接查找键。所以,这样的代码:
my $baz = $obj->{baz};但是,您不是使用最常用的方法来构建Perl对象,而是使用类别::Std。和类::性病做的事情非常不同。类::Std使用了一种名为“内出对象”的方法,这种方法在面向对象Perl中由Damian Conway推广,在大约20年前非常流行。
在普通对象中,每个对象都有一个散列。键是属性名,值是属性值。对于内出对象,每个属性都有自己的散列。键是对单个对象的字符串引用,值是该对象的属性值。
实际上,“标准”办法是:
$object{attr} = value;而内向外的方法是:
$attr{object} = value;人们喜欢内置对象的主要原因之一是属性散列可以是存储在类源代码中的词法变量。这意味着它们确实是私有的,不能从类的外部访问--除非使用提供的访问器方法。如果您想要强制Perl实现一种更强大的封装,这是很棒的。但是如果你想用你在这里所做的方式来突破这种封装,那就太糟糕了。
所以,没有。在你的情况下你不能这么做。
https://stackoverflow.com/questions/63595446
复制相似问题