代码之家  ›  专栏  ›  技术社区  ›  Eugene Yarmash

包是什么意思?

  •  19
  • Eugene Yarmash  · 技术社区  · 14 年前

    sub get_user {
        my $user = __PACKAGE__->{user};
        if (!defined $user) {
           # more code
           __PACKAGE__->{user} = $user;
        }
        return $user;
    }
    

    本模块编译于 use strict . 而且没有定义包变量。 是什么 __PACKAGE__->{user} 什么意思?

    3 回复  |  直到 14 年前
        1
  •  14
  •   ysth    14 年前

    __PACKAGE__ 当前包的名称;您的代码将其用作符号哈希引用。所以如果你的包是foo,那么它就是设置 $foo::foo{'user'} . 这是一件奇怪的事情;我怀疑这可能是个错误。

    因为它是一个象征性的引用,所以在严格的条件下是不允许的。然而,至少当当前包有多个部分(例如Foo::Bar,而不仅仅是Foo)时,似乎是这样。

        2
  •  7
  •   7stud    9 年前
    use strict;
    use warnings;
    use 5.012;
    
    {
        package X::Y;
    
        our $user = 10;
        say $user;
    
        say __PACKAGE__;
    
    }
    
    
    --output:--
    10
    X::Y
    

    包名可以是“X::Y”,但包的符号表名为“X::Y::”(请注意后面的冒号)。符号表是perl哈希,%X::Y::哈希中的键是X::Y包中使用的全局名称。对应的值是每个名称的typeglobs:

    use strict;
    use warnings;
    use 5.012;
    
    {
        package X::Y;
    
        our $user = 10;
        say $user;
    
        say __PACKAGE__;
        say $X::Y::{user};   #Hash name is %X::Y::
    
    
    }
    
    --output:--
    10
    X::Y
    *X::Y::user
    

    但是op里的表达是:

    __PACKAGE__->{user} 
    

    'X::Y'->{user}
    

    我看不出该行如何成功地从名为“X::Y::”(以两个冒号结尾)的哈希中检索任何内容。事实上,我得到一个错误:

    use strict;
    use warnings;
    use 5.012;
    
    {
        package X::Y;
    
        our $user = 10;
        say $user;
    
        say __PACKAGE__;
        say $X::Y::{user}; 
        say __PACKAGE__->{user};
    }
    
    --output:--
    10
    X::Y
    *X::Y::user
    Use of uninitialized value in say at 2.pl line 13.
    

    如果代码实际在某处创建了名为%X::Y的哈希,则代码将无错误运行:

    use strict;
    use warnings;
    use 5.012;
    
    
    %X::Y = (); #This hash has nothing to do with the hash named 
                #%X::Y::, which is the symbol table for the 
                #X::Y package.  
    
    $X::Y{user} = 'hello';
    
    
    {
        package X::Y;
    
        sub get_user {
            say __PACKAGE__->{user};
        }
    
        get_user;
    }
    
    
    --output:--
    hello
    

    如注释中所述,%X::Y哈希与X::Y包无关。事实上,这句话:

    %X::Y = ();
    

    在X包中显式声明一个名为Y的变量。X包和X::Y包是两个不同的包。

    子名称是一个包变量:

    use strict;
    use warnings;
    use 5.012;
    
    {
        package X::Y;
    
        sub get_user {say 'hello';}
    
        say $X::Y::{get_user};
    
    }
    
    --output:--
    *X::Y::get_user
    

    名为“get\u user”的typeglob存在,这意味着代码至少使用了一个名为“get\u user”的全局变量。

        3
  •  -5
  •   mcandre    14 年前

    __PACKAGE__ 是个杂凑。此语法访问键控值。