首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Moops、lexical_has和默认值

Moops、lexical_has和默认值
EN

Stack Overflow用户
提问于 2014-12-19 02:38:00
回答 1查看 387关注 0票数 11

我试图了解lexical_has属性是如何在驼鸟中工作的。这个特性来自Lexical::Accessor,据我所知,lexical_has函数能够通过使用标量引用(保存在accessor =>中)来生成对class可能“具有”的任何属性的CODE引用。然后,可以使用代码引用以“强制”作用域的方式访问类属性(因为它们是“内到外”??)。但这只是我的猜测和胡思乱想,所以我希望有一个更好的解释。我还想知道为什么在下面的示例中这种方法似乎不起作用:

使用作为Moops游戏攻略的一部分的示例,我正在创建一个class Car

代码语言:javascript
复制
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;  
    }    
}     

然后实例化对象并尝试使用其方法访问其属性:

代码语言:javascript
复制
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方法,如下所示:N.B.

代码语言:javascript
复制
method set_top_speed (Int $num) {   
    $self->$max_speed($num);
}

然后在我的最后一系列声明中称之为:

代码语言:javascript
复制
# shows expected error "too fast"
$solarcharged->speed(140);

$solarcharged->set_top_speed(100);

# prints 100
say $solarcharged->get_top_speed();

get_top_speed()方法开始正确返回。这是意料之中吗?如果是的话,类设置的默认设置是如何工作的?

我在这里将此报告为一个bug:https://rt.cpan.org/Public/Bug/Display.html?id=101024

由于您可以通过使用"perl约定“(即不使用lexical_has并以”_“作为私有属性的前缀)轻松地解决这个问题,并且这个问题是由bug引起的,所以我并不期望修复或补丁可以作为答案。我希望能解释一下Lexical::Accessor应该如何工作;它如何在访问器上“强制执行”私有内部范围;以及一些CS理论来解释为什么这是一件好事。

EN

回答 1

Stack Overflow用户

发布于 2020-07-26 11:10:27

根据OP提交的票证文件,这个错误是在词汇访问器0.009中修复的.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27558976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档