Wie würde ich eine Funktion schreiben, die ihre Argumente als Referenz auf ein Array zurückgibt?Wie kann eine Funktion ihre Argumentliste als Arrayreferenz zurückgeben?
Antwort
sub f {
return [@_];
}
$ref = f(2, 3, 5);
print "@$ref\n";
[@foo]
Das Konstrukt erzeugt einen Verweis auf eine neue, anonymes Array (Kopie des @foo
), während die \@foo
Konstrukt eine Referenz auf das Array @foo
erzeugt, dessen Inhalt möglicherweise später ändern.
Es gibt ein paar Möglichkeiten, um ein Unterprogramm zu erstellen, das seine Argumente als Array zurückgibt:
sub array {[@_]} # returns an array reference that is a copy of its argument
sub array_verbose { # the same as array(), but spelled out
my @copy = @_;
return \@copy;
}
sub capture {\@_} # returns a reference to the actual argument array
Es gibt einige wichtige Unterschiede zwischen array
und capture
:
my ($x, $y) = (3, 4);
my $array = array $x, $y;
my $capture = capture $x, $y;
say "@$array, @$capture"; # prints '3 4, 3 4'
$x++;
say "@$array, @$capture"; # prints '3 4, 4 4'
$$capture[1] *= 2;
say "@$array, @$capture"; # prints '3 4, 4 8'
say "$x $y"; # prints '4 8'
Wie diese Beispiele zeigen, Das von array()
erzeugte Array wird nach Wert kopiert, und diese Werte sind unabhängig von den ursprünglichen Argumenten. Das Array, das von capture()
erzeugt wird, behält einen bidirektionalen Alias zu seiner Argumentliste bei.
Ein weiterer Unterschied ist die Geschwindigkeit. capture()
ist ungefähr 40% schneller als array()
, da es die Elemente des Arrays nicht kopieren muss (oder sie sogar anschauen muss). Dieser Geschwindigkeitsunterschied variiert natürlich abhängig von der Länge der Argumentliste.
Ein zusätzlicher Effekt von capture()
nicht einmal, dass seine Elemente zu berühren, wenn ein Argument, das normalerweise Speicher verwendet wird zuteilen würde, wird nicht, dass die Zuteilung passieren, bis das Argument berührt wird:
my %hash;
my $hashcap = capture $hash{a}, $hash{b}, $hash{c};
say join ', ' => keys %hash; # prints nothing
$_++ for @$hashcap;
say join ', ' => keys %hash; # prints 'c, a, b'
In meinem eigenen Code, Ich buchstabiere normalerweise capture()
als cap()
oder schreibe es einfach inline:
my $y = sub{\@_}->(map $_**2, 1..10);
- 1. Eine Funktion klarstellen kann ihre Parameter ändern
- 2. Funktion vereinfachen Argumentliste
- 3. kann ein PHP-Array eine Funktion zurückgeben?
- 4. Kann eine PHP-Funktion viele Variablen zurückgeben?
- 5. Ihre Fitness-Funktion muss einen skalaren Wert zurückgeben
- 6. Wie eine Template-Funktion in einer Vorlage Argumentliste
- 7. Wie kann ich eine Liste von Objekten als IHttpActionResult zurückgeben?
- 8. Kann main() Funktion doppelt zurückgeben?
- 9. Wie kann diese rekursive Funktion true zurückgeben?
- 10. <: kann eine Template-Argumentliste nicht beginnen
- 11. zurückgeben mehr als eine Ausgabe auf C#
- 12. Verwirrung über Funktion, die eine Funktion zurückgeben
- 13. Verschachtelte statische Klasse kann ihre statischen Felder nicht zurückgeben
- 14. Kann eine Liste von einer rekursiven Funktion nicht zurückgeben
- 15. Funktion zum Zurückgeben einer Funktion, die eine Funktion zurückgibt usw.
- 16. Wie kann eine Funktion einen Zeiger auf eine Funktion zurückgeben? (C++)
- 17. kann _sync_val_compare_and_swap irgendetwas anderes als int zurückgeben?
- 18. Aufruf einer Funktion mit Argumentliste in Python
- 19. Kann ich eine String-Liste von einer Postgres-Funktion zurückgeben?
- 20. Kann eine VBA-Funktion in Excel einen Bereich zurückgeben?
- 21. Kann JPA Ergebnisse als Karte zurückgeben?
- 22. Kann ich eine andere Sequenz von einer Funktion zurückgeben?
- 23. Kann ich eine Liste aus einer LotusScript-Funktion zurückgeben?
- 24. Kann eine Funktion in R zwei Vektoren zurückgeben?
- 25. Wie eine Funktion eine Zahl in Python (mit Matplotlib) zurückgeben?
- 26. Kann Javascript eine Funktion als Text bekommen?
- 27. eine Funktion als Parameter
- 28. Kann Nhibernate eine Abfrage als IDictionary anstelle einer Entitätsklasse zurückgeben?
- 29. Wie kann ich ein Textfragment von einer XPath-Funktion zurückgeben?
- 30. Kann eine Klasse nicht als Funktion aufrufen