所以 perl5porters 正在讨论添加一个安全的解引用运算符,以允许类似的东西
$ceo_car_color = $company->ceo->car->color
if defined $company
and defined $company->ceo
and defined $company->ceo->car;
缩短为例如
$ceo_car_color = $company->>ceo->>car->>color;
哪里的$foo->>bar
意思defined $foo ? $foo->bar : undef
。
问题:是否有一些模块或不显眼的 hack 让我得到这个运算符,或者具有视觉上令人愉悦的语法的类似行为?
为了您的享受,我将列出我能够提出的想法。
多重解除引用方法(看起来很难看)。
sub multicall { my $instance = shift // return undef; for my $method (@_) { $instance = $instance->$method() // return undef; } return $instance; } $ceo_car_color = multicall($company, qw(ceo car color));
一个包装器,它变成
undef
一个代理对象(看起来更丑陋),它undef
从所有函数调用中返回。{ package Safe; sub AUTOLOAD { return undef } } sub safe { (shift) // bless {}, 'Safe' } $ceo_car_color = safe(safe(safe($company)->ceo)->car)->color;
由于我可以访问,和的实现
ceo()
,因此我考虑过直接从这些方法返回安全代理,但现有代码可能会中断:car()
color()
my $ceo = $company->ceo; my $car = $ceo->car if defined $ceo; # defined() breaks
不幸的是,我没有看到任何
perldoc overload
关于重载安全代理的含义defined
和//
安全代理的内容。