gpt4 book ai didi

raku - 代理的多方法

转载 作者:行者123 更新时间:2023-12-04 14:21:57 25 4
gpt4 key购买 nike

使用代理时是否可以对 store 方法使用 multidispatch?在以下最小示例中,代码在存储 Int 时被调用。

my $foo := do {
my $bar = 1;
Proxy.new:
:FETCH( method { return $bar} ),
:STORE( method (Int $i) { $bar = $i } )
}

say $foo; # 1
$foo = 2;
say $foo; # 2
$foo = "3"; # error, need to pass an Int

但我想处理 STORE如果给定一个 Str 则不同.我发现的解决方法(除了使用 given/ where 执行大型方法之外是在 block 内创建 multi sub 并返回子(因为无法引用 multi method使用 &foo ) 带有一个虚拟的第一个参数:
my $foo := do {
my $bar = 1;
Proxy.new:
:FETCH( method { return $bar} ),
:STORE(
do {
multi sub xyzzy ($, Int $i) { $bar = $i }
multi sub xyzzy ($, Str $i) { $bar = +$i + 1}
&xyzzy
}
)
}

say $foo; # 1
$foo = 2;
say $foo; # 2
$foo = "3";
say $foo; # 4

有没有更好的方法来做到这一点(主要是为了代码清晰使用 method 因为 sub 感觉......误导)?

最佳答案

关于误导:FETCHSTORE期望值 Callables ,可以是 methodsub .

回到这个问题,没有直接的方法可以做到这一点,但是有更好的间接方法可能更清楚。您可以通过设置 multi sub 来做到这一点。首先,然后通过 proto作为参数:

proto sub store(|) {*}
multi sub store(\self, Int) { say "Int" }
multi sub store(\self, Str) { say "Str" }

my $a := Proxy.new(
FETCH => -> $ { 42 },
STORE => &store,
);

say $a; # 42
$a = 42; # Int
$a = "foo"; # Str

如果你想让代码更短,但可能更难理解,你可以去掉 proto (因为它将为您自动生成)和 submulti (因为你能):
multi store(\self, Int) { say "Int" }
multi store(\self, Str) { say "Str" }

my $a := Proxy.new(
FETCH => -> $ { 42 },
STORE => &store,
);

say $a; # 42
$a = 42; # Int
$a = "foo"; # Str

关于raku - 代理的多方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58457529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com