Question

Je ne comprends pas à quoi pourraient servir les sous-programmes lvalue ?Qu'est-ce que je ne peux pas accomplir avec les sous-programmes normaux ?Pourriez-vous s'il vous plaît poster quelques exemples?

Merci

Était-ce utile?

La solution

Il est recommandé d'éviter les valeurs L.Ils sont amusants et tout, mais ils déroutent les nouveaux utilisateurs qui font des hypothèses sur le fonctionnement de tous les sous-marins, et cela devrait donc être évité dans le code lorsqu'une meilleure méthode est disponible.

Parfois, il peut être extrêmement pratique d’utiliser un résultat LValue pour effectuer le sale boulot.

substr( $string, $start, $stop ) = 'somevalue' # replaces the specified part of the substring. 

Cependant, cela fait également la même chose :

substr( $string, $start, $stop , 'somevalue' ); 

La différence ici étant que le premier a un pouvoir expressif nettement plus important, car il délègue le comportement au code qui l'utilise au lieu de la fonction elle-même.

Par exemple:

substr( $string, $start, $stop ) =~ s/a/b/g 

Il vous faudrait faire

my $x = substr( $string, $start, $stop ); 
$x =~ s/a/b/g/; 
substr( $string, $start, $stop, $x );

Ce qui est un peu méchant.

Bien qu'il y ait un problème supplémentaire ici, car vous devez vous demander si faire cette substitution ou non avec $x fonctionne rétroactivement pour modifier la chaîne ou non (en raison du fait que substr est un sous-LValue).Je ne pense pas que ce soit le cas, mais c'est assez ambigu, je dois vérifier le manuel pour me rappeler si c'est le cas ou non, et c'est mauvais.

Autres conseils

Vous pouvez utiliser lvalue sous-marins comme setters pour les membres de l'objet:

sub x : lvalue {
    my $self = shift;
    $self->{x};
}

Puis, plus tard:

$foo->x = 5;

combine l'intuitivité de membres directement avec la mise la flexibilité de l'encapsulation du compositeur, au cas où vous souhaitez changer la façon dont est mis en œuvre l'objet. Comparer les méthodes plus traditionnelles suivantes pour définir les membres en Perl:

intuitive mais fragile; si vous changez la façon dont $ foo est mis en œuvre?

$foo->{x} = 5;

Méthode traditionnelle en écriture; ne pas utiliser la syntaxe d'affectation pour ce qui équivaut à une cession:

$foo->set_x(5);

Bien sûr, les méthodes lvalue ont jamais vraiment été adopté par la communauté Perl, et l'utilisation des sous-marins lvalue est « bizarre » et tout ce que l'on gagnerait à intuitivité serait perdu par l'étrangeté de tout cela.

Ils fournissent une interface différente, que dans certaines circonstances, peut être plus intuitive. Contrairement à setters traditionnels, vous pouvez réellement changer la valeur directement. Par exemple

lvalue_sub($foo) =~ s/foo/bar/;

peut être plus propre que

my $tmp = some_sub($foo);
$tmp =~ s/foo/bar/;
some_sub($foo, $tmp);

Je ne peux pas parler pour les utiliser beaucoup dans mes affaires normales Perl, mais ils sont largement utilisés dans la langue de données Perl en prenant des tranches ou d'autres sous-sections d'un piddle. Par exemple:

my $a = sequence(100);
# use lvalue in this increment:
$a->where($a < 10)++;

# Zero-out the last four elements
# notice the use of the overloaded .= operator:
$a->slice("-10:") .= 0;

Comme beaucoup de choses en Perl, cette fonctionnalité n'est pas utilisé beaucoup dans l'écosystème, mais son utilisation au moins dans ce créneau rend la vie beaucoup plus facile pour les utilisateurs de PDL.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top