我创建了对象但后来不知道如何在创建对象后轻松使用它们(设置/获取并运行方法)。下面的代码有效,但后来我无法使用它来使用它我该怎么做?
# 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?
答案 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};
}