作者:麦芽糖的-寂寞 | 来源:互联网 | 2024-11-23 10:35
在编程实践中,经常需要检查一个对象变量是否已定义,并在其上执行方法调用。如果方法存在且返回非空值,则更新变量的值。这种情况下,如何做到既高效又符合DRY(Don't Repeat Yourself)原则呢?
例如,我们有一个字符串变量,想要尝试调用一个可能存在的方法,如果该方法返回非空值,则更新变量的值,否则保留原值。可以通过以下方式实现:
my $nicevariable = 'fobar';
# 关键步骤
(my $x := $nicevariable) = $x.?possibly_nonexistent_method // $x;
say $nicevariable; # 输出: 方法存在时的结果或 'fobar'
这种方法避免了重复命名变量,同时也确保了代码的清晰性和效率。
解决方案一
利用Perl 6中的默认值特性,可以简化这一过程:
my $nicevariable is default('fobar');
$nicevariable = $nicevariable.?possibly_nonexistent_method;
say $nicevariable; # 如果方法不存在,输出 'fobar'
这里,如果方法调用失败(即返回Nil),变量将自动恢复到默认值'fobar'。
解决方案二
另一种方法是使用更直接的方式,通过内联函数来避免多次引用变量:
my $nicevariable = 'fobar';
$nicevariable.=&{.?possibly_nonexistent_method // $_};
这段代码首先尝试调用方法,如果方法不存在或返回Nil,则保持变量的原始值不变。
解决方案三
对于更简洁的实现,可以直接使用with
语句来处理可能未定义的情况:
my $x = 'fobar';
$x = $_ with $x.?possibly_nonexistent_method;
这种方式不仅简洁,而且有效地处理了方法可能不存在的情况,确保变量在方法不存在时不会被意外修改。