【问题标题】:Not Able to Set Class' Attributes in Role无法在角色中设置类的属性
【发布时间】:2010-08-19 00:45:05
【问题描述】:

首先,我不确定需要包含多少信息,因为我很难追查这个问题的根源。

我有一个 Moose 角色,它有一个子例程(连同其他一些东西)尝试为这样的类设置属性:

$genre = Movie::Genre->new({
    genreName => 'Drama',
    genreID => '1'
                 });

问题是,它没有。紧随其后的$genre 的转储表明它仍然是空的:

$genre: bless( {}, 'Movie::Genre' )

更奇怪的是,当我在我的测试文件中执行 THE EXACT SAME LINE 时,它在这个转储中按预期工作:

$genre: bless( {
             genreID => '1',
             genreName => 'Drama'
           }, 'Movie::Genre' )

我正在努力寻找使这两行代码不同的原因,导致一行工作而另一行失败。

关于什么条件会导致第一个示例失败并允许第二个示例成功的任何想法?如有必要,我很乐意提供更多背景信息。谢谢!

【问题讨论】:

    标签: perl class attributes moose role


    【解决方案1】:

    该行只是将这些参数传递给 Movie::Genre 构造函数。由构造函数决定如何处理它们。

    听起来这个调用(在角色中)是在 Movie::Genre 类获得名为 genreNamegenreID 的属性之前执行的。默认情况下,Moose 构造函数会忽略它们无法识别的任何参数,因此不会生成警告。

    您的测试文件必须在将属性添加到 Movie::Genre 后进行调用。

    我们必须查看更多代码才能弄清楚发生这种情况的确切原因。

    【讨论】:

    • 谢谢你——你说得对。我有一个很长的角色链,在检查了谁先打电话给谁并进行了一些改组之后,问题得到了解决。
    • 推荐的组合多个角色(长链)的方法是一次调用with qw(Role1 Role2 Role3);。这样组合是无序的不应该影响你。然而实际上这可能并非每次都有效,因此(由于实现的怪癖)多次调用 with() 可以创建有序组合。
    猜你喜欢
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2023-03-09
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    相关资源
    最近更新 更多