我正在寻找使用复杂键(任意引用)作为哈希键的解决方案,除了它们对键执行深度比较而不是参考比较。
我正在寻找一个函数,最好是在一个核心模块中,它将任意引用(可能不包括子程序和类型地块引用)序列化为字符串,以便以后可以重构它们。
double h (double x)
{
if ( x == 0.0 ) return 1e99; // infinite
double k;
k = 1.0 + (1.0/x) + (1.0 /pow (x,2));
return k;
}
答案 0 :(得分:5)
没有必要将所有数据序列化只是为了拥有(可能是巨大的)哈希键。而是采用数据结构的校验和并将其用于密钥。将原始密钥存储为值的一部分。
以下是使用perl5i to do the deep checksum的示例。
sub get {
my $self = shift;
my $key = shift;
return $self->{$key->mo->checksum}{value};
}
sub set {
my $self = shift;
my($key, $val) = @_;
$self->{$key->mo->checksum} = $val;
return;
}
sub each {
my $self = shift;
my $code = shift;
my $val;
while( (undef, $val) = each %$self ) {
$code->($val->{key}, $val->{value});
}
return;
}
$obj->set(\@stuff, "value");
my $value = $obj->get(\@stuff);
$obj->each( func($key, $val) {
say "$key -> $val\n";
}
你可以将它包装在一个小类中,以使它更方便。
<?php
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
public function beforeRender()
{
$locale = 'en';
// register filters
$this->template->addFilter('myFilter', function ($s) use ($locale) {
// don't forget to set your own magic
return someMagic($s, $locale);
});
}
}
?>