gpt4 book ai didi

perl - Bread::Board - 注入(inject)带有 ArrayRef 类型约束的参数?

转载 作者:行者123 更新时间:2023-12-01 13:00:29 25 4
gpt4 key购买 nike

使用 MooseBread::Board , 是否可以创建一个具有 ArrayRef[SomeObject] 类型约束的属性的对象,并以如下方式注入(inject)该参数:

  • ArrayRef 约束得到维护,
  • 作为该 ArrayRef 成员的每个对象都具有 Bread::Board 满足的所有依赖关系,并且
  • 作为该 ArrayRef 成员的每个对象都是由 Bread::Board 创建的对象?

为了确保我能清楚地解释自己,让我们考虑一个非常幼稚的例子。假设我们有一个 Wheel 类:

package Wheel;
use Moose;

has ['size', 'maker'] => (isa => 'Str', is => 'rw', required => 1);

然后让我们创建一个 Vehicle 类,其中每个实例都包含一堆轮子:

package Vehicle;
use Moose;

has 'wheels' => (
is => 'rw',
isa => 'ArrayRef[Wheel]',
required => 1,
);

然后是否可以创建一个或多个 Wheel 实例,然后将包含这些实例的数组引用注入(inject)到我们新的 Vehicle 实例中?这显然行不通:

my $c = container 'app' => as {
container 'wheels' => as {
service 'maker' => "Bob's Tires";
service 'size' => "195R65/15";
service 'carTires' => (
class => 'Wheel',
dependencies => [ depends_on('maker'), depends_on('size') ],
)
};

container 'vehicles' => as {
service 'sedan' => (
class => 'Vehicle',
dependencies => {
# WON'T WORK
wheels => depends_on('/wheels/carTires'),
}
)
};
};
my $v = $c->resolve(service => 'vehicles/sedan');

有什么想法吗?是的,我知道我的 Vehicle 可以想象没有轮子,而且我正在尝试制造一辆单轮轿车,但我想你明白我的意思了。 :-) 这只是一个非常简单的例子。

最佳答案

您可以获得 carTires 服务以返回车轮的 ArrayRef:

container 'wheels' => as {
service 'carTires' => (
block => sub {
return [ map {Wheel->new} 1..4 ];
},
)
};

Vehicle 构造函数将处理类型约束方面的其余部分,因为您已经将其定义为 ArrayRef[Wheel]。

所以如果你这样做它会死:

container 'wheels' => as {
service 'carTires' => (
block => sub {
return [ map {Window->new} 1..4 ];
},
)
};

关于perl - Bread::Board - 注入(inject)带有 ArrayRef 类型约束的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6339322/

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