gpt4 book ai didi

perl - Moops lexical_has 和默认值

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

我试图了解 lexical_has属性在 Moops 中工作.此功能来自 Lexical::Accessor 而且,据我了解,lexical_has函数能够生成 CODE引用任何属性 a class可能通过使用标量引用(保存在 accessor => 中)“在词汇上具有”。然后可以使用 CODE 引用以“强制”范围的方式访问类属性(因为它们是“由内而外”的??)。但这只是我的猜测和疯狂的猜测,所以我希望能有更好的解释。我还想知道为什么这种方法在以下示例中似乎不起作用:

Moops introduction 中的示例开始工作我正在创建 class Car :

use Moops;

class Car {
lexical_has max_speed => (
is => 'rw',
isa => Int,
default => 90,
accessor => \(my $max_speed),
lazy => 1,
);

has fuel => (
is => 'rw',
isa => Int,
);

has speed => (
is => 'rw',
isa => Int,
trigger => method ($new, $old?) {
confess "Cannot travel at a speed of $new; too fast"
if $new > $self->$max_speed;
},
);

method get_top_speed() {
return $self->$max_speed;
}
}

然后我实例化对象并尝试使用它的方法来访问它的属性:
my $solarcharged = Car->new ;

# This correctly won't compile due to $max_speed scoping:
# say $solarcharged->$max_speed;

# This shows expected error "too fast"
$solarcharged->speed(140);

# This prints nothing - wrong behavior?
say $solarcharged->get_top_speed();

使用自定义访问器的最后一行让我感到困惑:什么也没有发生。我是否缺少该类的属性或设置(将其标记为渴望或 lazy => 0 不起作用)?我需要一个 BUILD功能?我缺少初始化步骤吗?

注: 如果我在类中添加一个 setter 方法,如下所示:
method set_top_speed (Int $num) {   
$self->$max_speed($num);
}

然后在我的最后一系列声明中调用它:
# shows expected error "too fast"
$solarcharged->speed(140);

$solarcharged->set_top_speed(100);

# prints 100
say $solarcharged->get_top_speed();
get_top_speed()方法开始正确返回。这是预期的吗?如果是这样,类(class)设置中的默认设置如何工作?

我在这里将其报告为错误: https://rt.cpan.org/Public/Bug/Display.html?id=101024 .

由于可以通过使用“perl 约定”(即不使用 lexical_has 并在私有(private)属性前加上“ _”)轻松解决这个问题,并且这个问题是由错误引起的,因此我不希望修复或补丁答案。对于赏金 - 我希望能解释一下 Lexical::Accessor应该工作;它如何“强制”访问者的私有(private)内部范围;也许还有一些关于为什么这是一件好事的 CS 理论。

最佳答案

根据ticket由 OP 提交,此错误已在 Lexical-Accessor 0.009 中修复。

关于perl - Moops lexical_has 和默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27558976/

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