因此,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
。
的问题是:是否有一些模块或非遮遮掩掩的黑客让我得到了这个操作符,或者类似的行为,有一个视觉上令人愉悦的语法?
为了你的快乐,我会列出我能想出的点子。
undef
转换为代理对象(看起来更丑)的包装器,它从所有函数调用中返回undef
。
{包安全;子自动返回undef }亚安全{(移位) //祝福{},‘安全’} $ceo_car_color =安全($company)->ceo)->car)->color;ceo()
、car()
和color()
的实现,所以我考虑直接从这些方法返回安全代理,但是现有的代码可能会中断:
我的$ceo = $company->ceo;我的$car =$ceo->汽车(如果定义为$ceo);# defined()中断
不幸的是,我在perldoc overload
中没有看到任何关于在我的安全代理中重载defined
和//
的意义。发布于 2012-09-27 10:01:12
也许这不是最有用的解决方案,但它是又一个WTDI ( nr的变体)。( 1)这是清单::Util的reduce的一个重要的用例,非常罕见。)
代码
#!/usr/bin/env perl
use strict;
use warnings;
use feature 'say';
use List::Util 'reduce';
my $answer = 42;
sub new { bless \$answer }
sub foo { return shift } # just chaining
sub bar { return undef } # break the chain
sub baz { return ${shift()} } # return the answer
sub multicall { reduce { our ($a, $b); $a and $a = $a->$b } @_ }
my $obj = main->new();
say $obj->multicall(qw(foo foo baz)) // 'undef!';
say $obj->multicall(qw(foo bar baz)) // 'undef!';
输出
42
undef!
注意:
当然应该是
return unless defined $a;
$a = $a->$b;
而不是上面的较短的$a and $a = $a->$b
来正确地处理定义的但错误的值,但我这里的重点是使用reduce。
发布于 2012-09-27 09:42:51
您可以使用eval
$ceo_car_color = eval { $company->ceo->car->color };
但是它当然会捕捉到任何错误,而不仅仅是在undef
上调用一个方法。
https://stackoverflow.com/questions/12617944
复制相似问题