gpt4 book ai didi

raku - 在 'raw' Positional 的类中从 AT-POS 方法(而不是代理实例)返回 'does' 标量容器?

转载 作者:行者123 更新时间:2023-12-03 16:55:40 25 4
gpt4 key购买 nike

我正在尝试实现一个“确实”的类 Positional这也允许我通过分配给 AT-POS 返回的结果来更新它的值。方法。最终,我能够编写以下按预期工作的类:

class Test does Positional
{
has $.slot_1 is rw = 12;
has $.slot_2 is rw = 24;

method AT-POS(\position)
{
my $t = self;

return-rw Proxy.new:

FETCH => method ()
{
position % 2 ?? $t.slot_1 !! $t.slot_2
},

STORE => method ($v)
{
if position % 2
{
$t.slot_1 = $v
}
else
{
$t.slot_2 = $v
}
}
}
}

my $test = Test.new;

die unless $test[2] == 24;

die unless $test[5] == 12;


$test[7] = 120;

die unless $test[2] == 24;

die unless $test[5] == 120;


$test[10] = 240;

die unless $test[2] == 240;

die unless $test[5] == 120;
是否有可能以某种方式(并且:简单地)返回绑定(bind)到 $!slot_1 的容器? (或 $!slot_2 )在 Test 内类实现?
在我发现 Proxy 的用途之前我尝试的实例 return (和 return-rw )表达式 position % 2 ?? $!slot_1.VAR !! $!slot_2.VAR 的结果,因为我的印象是 VAR方法让我可以访问底层容器,希望我可以简单地 return它。这并没有真正起作用,我还不明白为什么:我怀疑它以某种方式被强制恢复为一个值?
所以换句话说:是否可以简化我的 AT-POS在这种特殊情况下实现?
谢谢,
问候,
雷蒙德。

最佳答案

假设您不想要“slot_1”和“slot_2”的访问器,如果我正确理解了这个问题,这将是我的实现。我不会称它为 Test类,因为这会干扰 Test用于测试的类。

class Foo {
has @elements = 24, 12;

method AT-POS(Int:D $pos) is raw {
@elements[$pos % 2]
}
}

my $f = Foo.new;
say $f[2]; # 24
say $f[5]; # 12

$f[2] = 666;
say $f[4]; # 666
请注意,数组中的默认值已更改顺序,这是为了将算术保留在 AT-POS 中。简单的。
另请注意 is raw AT-POS 的定义中方法:它将确保在返回值时不会发生反容器化。这允许您只分配给任何 $f[2]返回。
希望这是有道理的!
另外: Array::Agnostic模块可能对您感兴趣,可以直接使用,也可以用作灵感来源。

关于raku - 在 'raw' Positional 的类中从 AT-POS 方法(而不是代理实例)返回 'does' 标量容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62968829/

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