gpt4 book ai didi

raku - 私有(private)属性的绑定(bind):nqp::bindattr vs :=

转载 作者:行者123 更新时间:2023-12-03 15:41:00 25 4
gpt4 key购买 nike

我试图找出绑定(bind)操作如何作用于属性以及它与 nqp::bindattr 如此不同的原因。 .考虑以下示例:

 class Foo {
has @!foo;

submethod TWEAK {
my $fval = [<a b c>];
use nqp;
nqp::bindattr( nqp::decont(self), $?CLASS, '@!foo',
#@!foo :=
Proxy.new(
FETCH => -> $ { $fval },
STORE => -> $, $v { $fval = $v }
)
);
}

method check {
say @!foo.perl;
}
}

my $inst = Foo.new;
$inst.check;

它打印:

$["a", "b", "c"]



更换 nqp::bindattr使用注释中的绑定(bind)运算符给出正确的输出:

["a", "b", "c"]



同样,如果 foo是一个公共(public)属性并且使用了访问器,由于访问器中发生了去冲突,因此输出也将是正确的。

我在我的 AttrX::Mooish 中使用了类似的代码使用 := 的模块会使实现过于复杂。到目前为止, nqp::bindattr为我做了很好的工作,直到出现上述问题。

我试图追踪 Rakudo 的内部结构,寻找 :=实现,但到目前为止没有任何成功。我会在这里询问有关如何模拟运算符或在源代码中查找其实现的建议。

最佳答案

在我深入回答之前:这篇文章中的大部分内容都是实现定义的,并且实现可以在 future 自由地以不同的方式定义它们。

要找出在 Rakudo Perl 6 下(天真地)编译成的东西,请使用 --target=ast选项(perl6 --target=ast foo.p6)。例如,绑定(bind)在:

class C {
has $!a;
submethod BUILD() {
my $x = [1,2,3];
$!a := $x
}
}

出来为:
                              - QAST::Op(bind)  :statement_id<7>
- QAST::Var(attribute $!a) <wanted> $!a
- QAST::Var(lexical self)
- QAST::WVal(C)
- QAST::Var(lexical $x) $x

将其切换为 @!a像这儿:
class C {
has @!a;
submethod BUILD() {
my $x = [1,2,3];
@!a := $x
}
}

出来为:
                              - QAST::Op(bind)  :statement_id<7>
- QAST::Var(attribute @!a) <wanted> @!a
- QAST::Var(lexical self)
- QAST::WVal(C)
- QAST::Op(p6bindassert)
- QAST::Op(decont)
- QAST::Var(lexical $x) $x
- QAST::WVal(Positional)
decont指令是这里最大的区别,它将采用 Proxy的内容通过调用它的 FETCH ,这就是为什么容器化消失了。因此,您可以通过插入 nqp::decont 来复制该行为。围绕 Proxy ,尽管这更引出了 Proxy 是什么的问题。如果没有它就可以得到正确的答案,就在那里做!

两个 :==使用案例分析(即通过查看左侧的内容)编译。 :=仅适用于左侧有限范围的简单表达式;它是一个绝对低级的运算符。相比之下, =回退到 sub如果案例分析没有提出更有效的形式来发出,则调用,尽管在大多数情况下它管理得更好。
:=的案例分析插入 decont当目标是带有符号 @ 的词汇或属性时或 % , 因为 - 在 Perl 6 级别 - 有一个项目绑定(bind)到 @%没有意义。使用 nqp::bindattr低于 Perl 6 语义,因此有可能以 Proxy 结束。使用它直接绑定(bind)在那里。但是,它也违反了其他地方的期望。不要指望这会顺利(但似乎你无论如何都不想这样做。)

关于raku - 私有(private)属性的绑定(bind):nqp::bindattr vs :=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52613076/

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