【问题标题】:perl: autoivivifcation of hash as parameter of object->new()?perl:哈希的自动激活作为对象-> new()的参数?
【发布时间】:2015-03-11 01:07:13
【问题描述】:

来自perlootut:

  my $cage = File::MP3->new(
      path          => 'mp3s/My-Body-Is-a-Cage.mp3',
      content       => $mp3_data,
      last_mod_time => 1304974868,
      title         => 'My Body Is a Cage',
  );

我不明白这里发生了什么。它看起来是自动激活的,如果是这样,那么 new 会同时传递类名和对新哈希的引用?

【问题讨论】:

  • 方法 new 将类名和其他 list 参数展平到 @_ 数组中。上面的代码中没有 hash 和 hashref。
  • 那么=> 到底发生了什么如果我写了一个模块并想用这种语法传递参数,我将如何访问它?
  • => in perl 是花哨的逗号; stackoverflow.com/a/4093914/223226sub new { my $class = shift; my %arg = @_; return bless \%arg, $class; }

标签: perl


【解决方案1】:

不涉及自动复活。你可能会对=> operator的使用感到困惑:

=> 运算符是逗号的同义词,但如果它以字母或下划线开头并且仅由字母、数字和下划线组成,它会使左侧的单词被解释为字符串。

虽然=>在声明散列时经常使用,但它本身并不会创建散列。

您发布的代码相当于

my $cage = File::MP3->new(
    'path',          'mp3s/My-Body-Is-a-Cage.mp3',
    'content',       $mp3_data,
    'last_mod_time', 1304974868,
    'title',         'My Body Is a Cage',
);

这只是将一个包含八个项目的列表传递给new 方法。

【讨论】:

    【解决方案2】:

    => 也称为 胖逗号,它的作用就像一个逗号——除非:

    1. 左边的东西是一个裸词,并且
    2. bareword 可以作为变量名(即没有奇怪的字符)

    在这种情况下,粗逗号将引用左侧的裸词。

    使用粗逗号是因为:

    1. 有些人发现输入粗逗号比在左侧的裸词周围输入引号更容易

    2. 粗逗号表示左轴和右轴之间的关系。然而,这种关系只是视觉上的——由函数来确定应该是什么关系。

    虽然在声明哈希时经常使用 =>,但它不会创建 自己散列。

    也就是说:

    use strict;
    use warnings;
    use 5.016;
    use Data::Dumper;
    
    my %href = (
        'a', 10,
        'b', 20,
        'c', 30,
    );
    
    say $href{'a'};
    
    say Dumper(\%href);
    
    
    --output:--
    10
    $VAR1 = {
              'c' => 30,
              'a' => 10,
              'b' => 20
            };
    

    perl 不是 ruby​​。

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 2016-01-28
      • 1970-01-01
      相关资源
      最近更新 更多