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
,如果可能的话。
你知道变量的默认特征吗?
不确定它是否适合您的用例,但$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
被重置为其默认值;
我不完全确定“在操作中只使用一次变量”是什么意思。如果 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)
不知道为什么我一开始就没有……
假设该方法返回已定义的内容,您可以这样做(如果我正确理解了问题):
my $x = "foobar";
$x = $_ with $y.?possibly-nonexistent-meth;
Run Code Online (Sandbox Code Playgroud)
$x
如果该方法不存在(或者它确实存在并返回一个类型对象),则将保持不变。