Perl - 创建对象但是如何获取单个对象?

时间:2015-03-28 18:43:40

标签: perl oop

我创建了对象但后来不知道如何在创建对象后轻松使用它们(设置/获取并运行方法)。下面的代码有效,但后来我无法使用它来使用它我该怎么做?

# My array of coffeecup names
my @coffeeCupNames = ("Espresso", "Sumatran", "Java");

# Create an array to hold my objects once they are created
my @objects = ();

# Create a new coffee cup object with the name of the coffee cup
foreach (@coffeeCupNames)
{
    push @objects, new virtualCoffeeObject("$_");
}

# How do I get at the Espresso coffee cup object?

4 个答案:

答案 0 :(得分:2)

您的对象是数组的成员。

my $o = $objects[0];
$o->method(@args);

或者,很快:

$objects[0]->method(@args);

答案 1 :(得分:2)

首先,请记住Perl不是Java。

因此,尽管它看起来很吸引人,但请不要使用new Class。这称为间接对象表示法。它看起来很可爱和熟悉,但它会咬你。

我假设virtualCoffeeObject是具有其代表的咖啡类型的访问者的类。我提到过,Perl不是Java吗?

假设您有以下准系统课程:

package My::Coffee;

sub new {
   my $class = shift;
   bless { name => $_[0] } => $class;
}

sub name {
   my $self = shift;
   $self->{name};
}

并且,如下名称:

# My array of coffeecup names
my @names = qw(Espresso Sumatran Java);

您希望使用相应的名称创建My::Coffee个对象的数组。在Perl中,你会这样做:

 my @coffees = map My::Coffee->new($_), @names;
  

我如何获得Espresso咖啡杯对象?

没有理由假设只有一个名为Espresso的My::Coffee个实例:

 my @espressos = grep $_->name eq 'Espresso', @coffees;

您可以在任一阵列的元素上调用方法:

 say $_->name for @coffees;

 say $_->name for @espressos;

我是否提到Perl不是Java?

答案 2 :(得分:2)

我同意其他答案给出的所有提示,但我不明白为什么没有人发布明显的解决方案来跟踪创建的对象。

当然,您可以将对象存储在专用标量变量中:

my $espresso = VirtualCoffee->new("Espresso");
my $sumatran = VirtualCoffee->new("Sumatran");
...

当您从阵列中绘制咖啡类型时,您可能不希望为所有咖啡使用固定变量名称。选择的工具是Perl中的哈希。

my @coffee_cup_names = ("Espresso", "Sumatran", "Java");

# create a VirtualCoffee object and store it with its name as hash key
my %coffees = map {$_ => VirtualCoffee->new($_)} @coffee_cup_names;

# how to get the objects:
my @coffee_sorts = keys   %coffees;
my @all_coffees  = values %coffees;
my $espresso = $coffees{Espresso};

要了解有关Perl中哈希的更多信息,建议使用Modern Perl "book" (read online)

我允许自己将变量名改编为常见的Perl样式。

答案 3 :(得分:0)

首先要注意的是,最佳做法是调用" new"方法(和所有方法)与 - >而不是像子程序,即$ object = Class-> new();

for (@objects) {
   my $object = $_;

   #call methods on the object
   $object->method();

   #assign vars to method call result
   my $var = $object->method();

   #access the objects attributes directly (not advised)
   $var = $object->{attribute};
}