在我的对象构造函数中,我有一条语句可以同时初始化两个属性:
($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) 我的Moose课程消耗了一个我不允许改变的角色.该角色定义具有默认值的属性.我需要我的类具有该属性,但具有不同的默认值.
那可能吗?
我能想到的就是用我自己的一些代码包围"new"方法,如下所示:
around new => sub {
my ($orig, $self) = (shift, shift);
return $self->$orig(@_, the_attribute => $new_value);
}
Run Code Online (Sandbox Code Playgroud)
但我不确定周围的新品是否有效,并且也希望更优雅.
我的基于Moo的类具有惰性和非惰性属性,这两个属性都具有sub default
和coerce
subs.如果我没有初始化属性,我发现为普通属性调用了both default
和coerce
subs,但只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。
定义一组属性:
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怎么做?
任何人都可以提供一个代码示例,如何在类中设置变量更改的观察者?我试图用几种方式使用不同的功能(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) 我期待一个构建器方法可以访问调用者提供的所有其他属性.但它似乎只能访问那些名字按字母顺序小于当前属性的人.例如,为什么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) 我正在尝试在 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?