标签: moo

如何以Mooseish方式声明2个从属属性?

在我的对象构造函数中,我有一条语句可以同时初始化两个属性:

($self->{token}, $self->{token_start}) = $self->_get_authorized_token();
Run Code Online (Sandbox Code Playgroud)

所以我得到了令牌,并且它在一条语句中一起开始了。

现在我尝试移植我的模块以使用Moo(se),在这里我不知道如何同时设置这两个绑定属性?一些伪代码将是这样的:

has qw/token token_start/ => (
    is  => 'rw',
    default => shift->_get_authorized_token(); 
);
Run Code Online (Sandbox Code Playgroud)

但是如何以Moo(se)ish方式声明2个绑定属性?


编辑。我展示了该方法的代码_get_authorized_token,也许会带来一些想法:

sub _get_authorized_token {
    my $self = shift;
    my $postData = { 'apikey' => $self->{key} };
    my $url = $self->{base_url} . '/seller';
    my $xml = $self->_post(url => $url,
                            postdata => $postData,
                        );
    my $ref = XMLin($xml, SuppressEmpty => '' );
    my $time = $ref->{Notification_Datetime};
    my $token = $ref->{Notification_Data}{body}{token};
    return ($token, $time); 
}
Run Code Online (Sandbox Code Playgroud)

perl moose moo

4
推荐指数
1
解决办法
232
查看次数

在Moose中,如果角色使用默认值定义属性,如何在我的消费类中更改该默认值?

我的Moose课程消耗了一个我不允许改变的角色.该角色定义具有默认值的属性.我需要我的类具有该属性,但具有不同的默认值.

那可能吗?

我能想到的就是用我自己的一些代码包围"new"方法,如下所示:

around new => sub {
    my ($orig, $self) = (shift, shift);
    return $self->$orig(@_, the_attribute => $new_value);
}
Run Code Online (Sandbox Code Playgroud)

但我不确定周围的新品是否有效,并且也希望更优雅.

perl moose moo

4
推荐指数
1
解决办法
606
查看次数

Moo,惰性属性和默认/强制调用

我的基于Moo的类具有惰性和非惰性属性,这两个属性都具有sub defaultcoercesubs.如果我没有初始化属性,我发现为普通属性调用了both defaultcoercesubs,但只default调用了lazy属性.这似乎不一致.这是示例代码:

package Foo;
use Moo;

has nrml => ( is => 'ro',
              default => sub { print "nrml default\n" },
              coerce  => sub { print "nrml coerce\n" } 
            );

has lazy => ( is => 'ro',
              lazy => 1,
              default => sub { print "lazy default\n" },
              coerce  => sub { print "lazy coerce\n" }
            );



my $q = Foo->new( );

$q->lazy;
Run Code Online (Sandbox Code Playgroud)

输出是:

nrml default
nrml coerce
lazy default
Run Code Online (Sandbox Code Playgroud)

coerce …

perl moo

3
推荐指数
1
解决办法
2119
查看次数

如何更改属性类型?(Perl Moo)

我们使用 Perl Moo。

定义一组属性:

package C;
use Moo;
use Types::Standard qw(Str Int Num Maybe);

has 'x' => (is=>'rw', isa=>Str);
has 'y' => (is=>'rw', isa=>Int);
has 'z' => (is=>'rw', isa=>Int);

# here to insert make_optional() described below

1;
Run Code Online (Sandbox Code Playgroud)

我想编写一个例程,将某些属性的 T 替换为 Maybe[T]。例如:make_optional(qw(x y))应该使 type ofx Maybe[Str]和 type of y Maybe[Int]

用Moo怎么做?

perl attributes types moo

3
推荐指数
1
解决办法
350
查看次数

观察Perl类中属性的更改

任何人都可以提供一个代码示例,如何在类中设置变量更改的观察者?我试图用几种方式使用不同的功能(Scalar :: Watcher,Moo的触发属性)和OOP框架(Moo,Mojo :: Base),但都失败了.

以下是我失败的代码,以便更好地理解我的任务.在这个例子中,我需要每次更改attr1时更新attr2.

使用Mojo :: Base和Scalar :: Watcher:

package Cat;
use Mojo::Base -base;
use Scalar::Watcher qw(when_modified);
use feature 'say';

has 'attr1' => 1;
has 'attr2' => 2;

has 'test' => sub { # "fake" attribute for getting access to $self
  my $self = shift;
  when_modified $self->attr1, sub { $self->attr2(3); say "meow" };
};


package main;
use Data::Dumper;

my $me = Cat->new;
$me->attr1;
warn Dumper $me;
say $me->attr1(3)->attr2; # attr2 is still 2, but …
Run Code Online (Sandbox Code Playgroud)

oop perl watch mojolicious moo

2
推荐指数
1
解决办法
123
查看次数

为什么Moo的构建器方法只能访问其他一些属性?

我期待一个构建器方法可以访问调用者提供的所有其他属性.但它似乎只能访问那些名字按字母顺序小于当前属性的人.例如,为什么b这里的建造者能看到价值a而不是c?('a'和'c'都出现在最终对象中)

码:

#!/usr/bin/perl -w
use strict;
use Data::Dumper;
{
    package P;
    use Moo;

    printf "Moo version: %s\n", $Moo::VERSION;

    # a and c are defined in the same way
    has a => ( is => 'ro' );
    has c => ( is => 'ro' );
    has b => (
        is => 'ro',
        builder => '_build_b',
    );

    sub _build_b {
        my ($self) = @_;
        print Data::Dumper->new(
            [ $self ], [ 'self_during_build_b' ]
        )->Indent(1)->Sortkeys(1)->Dump;
        return "somebuiltvalue";
    } …
Run Code Online (Sandbox Code Playgroud)

perl moo

2
推荐指数
1
解决办法
202
查看次数

在@INC 中找不到 Moo.pm

我正在尝试在 dzsoft perl 编辑器中运行 .pm 程序。但我收到了这个错误

Can't locate Moo.pm in @INC (@INC contains: C:\Users\123\Desktop\ C:/Perl64/site/lib C:/Perl64/lib .) at UniNE.pm line 5.
Run Code Online (Sandbox Code Playgroud)

我的解释器是 ActivePerl-5.18.2.1802-MSWin32-x64-298023 如何将 moo.pm 添加到 lib?

perl locate moo

0
推荐指数
1
解决办法
1万
查看次数

标签 统计

moo ×7

perl ×7

moose ×2

attributes ×1

locate ×1

mojolicious ×1

oop ×1

types ×1

watch ×1