2017-10-18 4 views
2

Pendant que je travaillais sur un script Perl, une question se posait juste pour la curiosité. J'ai remarqué qu'aucun avertissement ou erreur n'apparaît lorsque je crée un objet sans l'assigner à une variable (scalaire/tableau/hachage).Un objet est-il accessible s'il n'est pas affecté à une variable?

Par exemple:

Person->new ('Sebastian', 'Vettel', 30); 

Un MCVE est la suivante.

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); 

La sortie:

créé un objet Personne: Sebastian Vettel (30)

Ma question est que. Y a-t-il un moyen d'accéder à l'objet créé?

+1

Ajouter 'sub DESTROY {print" détruit \ n "; } 'au paquet et' <>; 'après' Person-> new' et voyez par vous-même. – ikegami

+0

@ikegami J'ai essayé et vu. Merci. – ahmedus

Répondre

10

No.

Un appel à Person->new est sous le capot se résout comme ceci:

Person::new('Person', 'Sebastian', 'Vettel', 30); 

Fonctions Perl reviennent toujours des valeurs scalaires. Parfois, il y a un undef, et parfois le nombre de scalaires est zéro (ce qui est une liste vide). Si vous affectez ces valeurs à une variable ou si vous appelez la fonction dans un autre élément qui attend une expression, les valeurs deviennent accessibles.

my $foo = frobnicate(); 
print frobnicate(); 

Perl a un avertissement qui vous indique si vous utilisez une expression dans un lieu où il est la valeur retournée est pas utile.

Considérons cet exemple.

use warnings; 
4; 

Ceci vous avertira.

utilisation Inutile d'une constante (4) dans un contexte vide à ...

Mais pour un appel de fonction, Perl ne sait pas vraiment s'il y aura une valeur de retour, donc il ne peut pas avertir à ce sujet. Parfois, la fonction renvoie quelque chose pour plus de commodité, comme open, où vous choisissez d'ignorer la valeur de retour, ou vous pouvez l'utiliser pour vérifier les erreurs. Mais finalement, Perl ne sait pas si tu as voulu faire ça.

Person->new; 

La valeur de retour de cet appel de fonction est simplement mis au rebut dans un contexte vide et Perl ne se plaint pas, parce qu'il n'y a aucune raison de supposer que c'était une erreur.

Vous ne pouvez pas accéder à cet objet, il est créé, puis jeté.


La seule exception est si elle est à la fin d'un sous, où Perl retourne implicitement la valeur de retour de la dernière instruction du bloc, ce qui rend les choses comme cela possible.

sub build { Foo->new } 

Mais ce n'est pas quelque chose dont vous avez besoin dans ce contexte.