Perl 为什么Moo';s builder方法是否只能访问某些其他属性?

Perl 为什么Moo';s builder方法是否只能访问某些其他属性?,perl,moo,Perl,Moo,我希望生成器方法能够访问调用者提供的所有其他属性。但它似乎只能访问那些名称的字母顺序比当前属性的字母顺序短的人。例如,为什么b的生成器在此处可以看到a的值,而不能看到c?(最终对象中同时存在“a”和“c”) 代码: 输出: Moo version: 2.003004 $self_during_build_b = bless( { 'a' => 1 }, 'P' ); $p = bless( { 'a' => 1, 'b' => 'somebuiltvalue',

我希望生成器方法能够访问调用者提供的所有其他属性。但它似乎只能访问那些名称的字母顺序比当前属性的字母顺序短的人。例如,为什么
b
的生成器在此处可以看到
a
的值,而不能看到
c
?(最终对象中同时存在“a”和“c”)

代码:

输出:

Moo version: 2.003004
$self_during_build_b = bless( {
  'a' => 1
}, 'P' );
$p = bless( {
  'a' => 1,
  'b' => 'somebuiltvalue',
  'c' => 3
}, 'P' );

事实上,对于特定成员,您不应该假设生成器中的任何其他字段。如果类的某个成员的值取决于一个或多个其他成员的值,则处理该值的适当位置将是类方法

我不知道你到底想实现什么,但你在寻找什么


或者,也许
b
需要成为你班上的一种方法

谢谢Sinan的快速回答。“您不应该为特定成员在生成器中的任何其他字段做任何假设”-我在任何地方都没有看到这方面的文档。令人困惑的是,那些字母顺序较低的是可用的,而其他的则不可用。是的,我使用了
lazy=>1
,虽然
BUILD
可能是一个更好的地方。我真的不明白为什么我不能依赖于实际提供的属性或具有默认值的属性。这难道不会让构建器更方便吗?有没有一种语言可以让您依赖于构造函数中私有非静态字段的初始化顺序?如果属性需要访问完全初始化对象成员的值,则需要将其作为方法实现<代码>惰性由于方法调用的结果是缓存的,所以它更有效,但这就是其中的原因。@Peter:我怀疑只有名称在词汇上较小的属性才可以访问。
Moo
使用的构造是一个散列,它本质上是故意不排序的,因此我希望生成器方法以随机顺序调用。很可能
Moo
会对属性名称进行排序,只要相同初始化代码的连续运行产生相同的结果。一个哑属性<代码> ZZ,它的构造器方法可以访问所有其他属性,但这是一个不愉快的方法,一个普通的方法当然是可取的。@ PTERV.M.RCCHE:“为什么我不能依赖属性”——你在构造函数的初始化过程中,这就足够了。最好假设在所有这些都完成之前没有数据。您不仅必须只处理该成员,而且如果它涉及复杂的数据结构或其他对象的组合/继承(其构造顺序等),您还必须小心处理该成员本身。正如西南所说,它存在于每一种语言中,在那些涉及OO机制较多的语言中更是如此。
Moo version: 2.003004
$self_during_build_b = bless( {
  'a' => 1
}, 'P' );
$p = bless( {
  'a' => 1,
  'b' => 'somebuiltvalue',
  'c' => 3
}, 'P' );