- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
不久前,我编写了一个例程,它解析给定的字符串并以散列(field => value, field2 => value2)
的形式返回记录。很好,除了要求发生了变化,我现在需要返回更多数据并提供 getter 方法来获取这些数据。因此,我调整了例程以返回一个 Record
对象,该对象将相同的哈希存储在 data
属性中。
但是,这会破坏需要散列的旧代码,以便它可以使用 $record->{field}
获取数据。使用新的 Record
对象,该数据的路径现在是 $record->{data}->{field}
或 $record->getByShortName('字段')
.
我的想法是重载对象的 FETCH 方法并返回相应的字段。但是,这似乎不起作用。看起来从未调用过 FETCH。
我正在寻找三个建议:
这是一个 MVE:
Record.pm
package Record;
use strict;
use warnings;
use Data::Dumper;
use overload fallback => 1, '%{}' => \&access_hash;
sub new {
my ($class, %args) = @_;
my %fields = (answer => 42, question => 21);
$args{fields} = \%fields;
return bless { %args }, $class;
}
sub access_hash {
my ($self) = shift;
return $self; # cannot return $self->{fields} because that would recurse ad infinitum
}
sub FETCH {
print(Dumper(@_)); # does not return anything, is this method not being called
}
test.pl
use Record;
my $inst = Record->new();
print($inst->{answer}."\n");
print($inst->{question}."\n");
最佳答案
Record
是一个受祝福的哈希引用,因此如果您重载 %{}
运算符,您将无法访问底层哈希的字段。
overload
作者考虑了这一点,并提供了 overloading
pragma 作为禁用此用例和其他一些用例的重载的方法。
use overload '%{}' => \&access_hash;
...
sub access_hash {
no overloading '%{}';
my ($self) = shift;
return $self->{fields};
}
在 Perl 5.10 之前,解决方法是通过暂时将对象重新赋予不会激活重载运算符的对象来禁用重载。
sub access_hash {
my ($self) = shift;
my $orig_ref = ref($self);
bless $self, "#$%^&*()";
my $fields = $self->{fields};
bless $self, $orig_ref;
return $fields;
}
关于perl - 重载 Perl 对象以将哈希访问重定向到自定义例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58065366/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!