如何初始化新对象的内容

时间:2016-07-12 08:49:18

标签: perl

如何设置初始值?这就是我所做的,但我没有得到正确的输出。

sub new
{

    my $class=shift;
    my $self={
        Color => 0,
        Cost => 0,
        Wheels => 0,
        CC => 0,
        RegNo => 0,
        TopSpeed => 0,
        CurrentSpeed => 0,
        Angle => 0,
    };

    bless $self,$class;
    return $self;
}

在.pl文件中,我创建了这样的对象:

我的$obj=new vehicle(); 然后当我调用一个显示变量的函数时,它会给我null。

2 个答案:

答案 0 :(得分:3)

您的示例代码中缺少很多内容。我们假设你有这个

(请注意,尽管它会起作用,但此代码错误,因为它使用的是全小写的包名。这些标识符是为 Perl pragmas 保留的,如{{ 1}},=tbl.CalculateColumn(C23,"Result", fn.FixInput("(fn, tbl) => tbl.Filter(tbl, 'tier_info2', fn)", "='SPOT2'")) strictwarnings等。)

vehicle.pm

open

main.pl

feature

然后输出是您可能期望的

package vehicle;

use strict;
use warnings;

sub new {

    my $class = shift;

    my $self = {
        Color        => 0,
        Cost         => 0,
        Wheels       => 0,
        CC           => 0,
        RegNo        => 0,
        TopSpeed     => 0,
        CurrentSpeed => 0,
        Angle        => 0,
    };

    bless $self, $class;
}

1;

但是在路上你可能遇到很多错误。您最有可能以与文件名不同的方式命名包。包名称 必须 use strict; use warnings 'all'; use vehicle; my $obj = new vehicle(); use Data::Dump; dd $obj; 语句匹配,并且必须调用该文件bless({ Angle => 0, CC => 0, Color => 0, Cost => 0, CurrentSpeed => 0, RegNo => 0, TopSpeed => 0, Wheels => 0, }, "vehicle")

请注意,您应该正确使用CamelCase作为软件包及其文件名,因此它在use和名为<package name>.pm的文件中,您可以在代码中使用package Vehicle需要它

除非您显示所有模块文件

,否则无法看到确切的问题


更新

表单Vehicle.pm称为 间接对象语法 。它在perldoc perlobj中记录了

  

在文件句柄的情况下,不鼓励使用此语法,因为它可能会混淆Perl解释器。有关详细信息,请参见下文。

引用&#34;文件句柄案例&#34;是指use Vehicle,这是一种常见的用法,它不能被弃用。它相当于my $object = new Class(),其中print FILEHANDLE LISTIO::Handle对象

然而,FILEHANDLE->print LISTFILEHANDLE是不可取的,new CLASS LIST确定了原因。虽然它可能看起来更整洁,而且更像您使用过的其他语言,但您应该坚持使用new OBJECT LISTperlobj

答案 1 :(得分:0)

很难确定,因为您没有向我们展示用于显示属性的功能。但这很有效(代码中的风格变化很小):

# In Vehicle.pm
package Vehicle;

use strict;
use warnings;

sub new {

  my $class = shift;
  my $self = {
        Color => 0,
        Cost => 0,
        Wheels => 0,
        CC => 0,
        RegNo => 0,
        TopSpeed => 0,
        CurrentSpeed => 0,
        Angle => 0,
  };

  bless $self,$class;
  return $self;
}

sub current_speed {
  return shift->{CurrentSpeed};
}

1;

在你的程序中(我称之为vehicle):

# In vehicle
#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use Vehicle;

my $v = Vehicle->new;

say $v->current_speed;

然后,运行vehicle

$ perl vehicle
0

这似乎是正确的。