如果不是 Nil,则变量重新分配方法结果

myk*_*hal 8 syntactic-sugar raku

是否有应用和分配对象变量方法调用的惯用方法,但前提是它已定义(方法和结果)?

就像使用安全调用运算符.?定义或运算符//,以及“DRY 原则”——在操作中只使用一次变量?

像这样(但使用另一个变量感觉像是在作弊):

my $nicevariable = "fobar";

# key step
(my $x := $nicevariable) = $x.?possibly-nonexistent-meth // $x;

say $nicevariable;  # => possibly-nonexistent-meth (non-Nil) result or "foobar"
Run Code Online (Sandbox Code Playgroud)

... 并避免andthen,如果可能的话。

dwa*_*ing 9

你知道变量的默认特征吗?

不确定它是否适合您的用例,但$some-var.?unknown-method返回 Nil,因此:

my $nicevariable is default("fobar");
$nicevariable = $nicevariable.?possibly-nonexistent-meth;
say $nicevariable;  # fobar
Run Code Online (Sandbox Code Playgroud)

导致$nicevariable被重置为其默认值;


cod*_*ons 8

我不完全确定“在操作中只使用一次变量”是什么意思。如果 Liz 的回答合格,那么这可能是更清洁的方法。

如果没有,这里有一种不同的方法可以避免两次命名变量:

my $nicevariable = "foobar";
$nicevariable.=&{.^lookup('possibly-nonexistent-meth')($_)}
Run Code Online (Sandbox Code Playgroud)

这对我的口味来说有点太神秘了。这是它的作用:如果该方法存在,那么它类似于¹调用&method($nicevariable),它与$nicevariable.method. 如果该方法存在,那么它就像调用Mu($nicevariable)-那就是,强迫$nicevariable进入Mu或亚型Mu。但由于一切都已经是 的子类型Mu,所以这是一个无操作,只是返回$nicevariable

[1]:不完全是,因为&method将是一个 Sub,但基本上。

编辑

实际上,这使事情变得过于复杂。这是一个更简单的版本:

my $nicevariable = "foobar";
$nicevariable.=&{.?possibly-nonexistent-meth // $_}
Run Code Online (Sandbox Code Playgroud)

不知道为什么我一开始就没有……

  • 编辑非常接近我的意思......我正在玩`.=`,但我没有想到`&`技巧,谢谢。 (3认同)

Eli*_*sen 6

假设该方法返回定义的内容,您可以这样做(如果我正确理解了问题):

my $x = "foobar";
$x = $_ with $y.?possibly-nonexistent-meth;
Run Code Online (Sandbox Code Playgroud)

$x如果该方法不存在(或者它确实存在并返回一个类型对象),则将保持不变。