如果没有分配给任何变量,是否可以访问对象?

ahm*_*dus 3 oop perl object

当我在研究Perl脚本时,出现了一个问题只是为了好奇.我注意到,当我创建一个对象而没有将其分配给任何变量(标量/数组/散列)时,不会出现警告或错误.

例如:

Person->new ('Sebastian', 'Vettel', 30);
Run Code Online (Sandbox Code Playgroud)

MCVE如下.

use strict;
use warnings;

package Person;
sub new {
  my $class = shift;
  my $self = {
    FirstName => shift,
    LastName  => shift,
    Age       => shift,
  };
  print "Created a Person object: $self->{FirstName} ",
        "$self->{LastName} ($self->{Age})\n";
  bless  $self, $class;
  return $self;
}

Person->new ('Sebastian', 'Vettel', 30);
Run Code Online (Sandbox Code Playgroud)

输出:

创建了一个Person对象:Sebastian Vettel(30)

我的问题是.有没有办法访问创建的对象?

sim*_*que 10

没有.

一个电话Person->new是在幕后解决,因为这:

Person::new('Person', 'Sebastian', 'Vettel', 30);
Run Code Online (Sandbox Code Playgroud)

Perl中的函数始终返回标量值.有时会有一个undef,有时标量的数量为零(这是一个空列表).如果将这些值分配给变量,或者在需要表达式的其他内容中调用函数,则可以访问这些值.

my $foo = frobnicate();
print frobnicate();
Run Code Online (Sandbox Code Playgroud)

Perl有一个警告,告诉您是否在其返回值无效的地方使用表达式.

考虑这个例子.

use warnings;
4;
Run Code Online (Sandbox Code Playgroud)

这会给你一个警告.

在void上下文中无用的常量(4)...

但是对于函数调用,Perl并不真正知道是否会有返回值,所以它无法对此发出警告.有时函数返回一些东西是为了方便,比如open,你选择忽略返回值,或者你可以用它来进行错误检查.但最终,Perl不知道你是否打算这样做.

Person->new;
Run Code Online (Sandbox Code Playgroud)

该函数调用的返回值在void上下文中被简单地丢弃,并且Perl不会抱怨,因为没有理由认为这是一个错误.

您无法访问此对象,它会被创建然后被丢弃.


唯一的例外是如果它位于sub的末尾,其中Perl隐式返回块的最后一个语句的返回值,这使得这样的事情成为可能.

sub build { Foo->new }
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,这不是你需要关心的事情.