Jak przekazać funkcję, a
, do funkcji, b
i mieć b
połączenie a
w Perlu?Przekazywanie obiektu funkcji i wywoływanie go
Odpowiedz
Oto kompletny, działający skrypt, który demonstruje to, o co prosisz.
sub a { print "Hello World!\n"; }
sub b {
my $func = $_[0];
$func->();
}
b(\&a);
Oto wyjaśnienie: wziąć odniesienie do funkcjonowania a
mówiąc \&a
. W tym momencie masz odniesienie do funkcji; podczas gdy normalnie funkcja byłaby wywoływana przez powiedzenie func()
wywołujesz odwołanie do funkcji, mówiąc, że składnia $func->()
ma również inne odwołania. Na przykład, oto przykład radzenia sobie z odniesieniami tablicy i hash:
sub f {
my ($aref, $href) = @_;
print "Here's an array reference: $aref->[0]\n"; # prints 5
print "Here's a hash ref: $href->{hello}\n"; # prints "world"
}
my @a = (5, 6, 7);
my %h = (hello=>"world", goodbye=>"girl");
f(\@a, \%h);
Można uzyskać dostęp do podprogramów referencje jako \&my_method
w Perl, i nazywają te referencje z $myref->();
. Wypróbuj to:
perl -e'sub a { print "foo in a"; }; sub b { shift->(); }; b(\&a);'
Powodzenia!
Co jeśli przechodzę przez functi w ramach skrótu, to może wyglądać tak? $ args {function} ->(); – Kys
Nawiązując do przykładu Eli Courtwright: jeśli używasz tylko pierwszą funkcję raz, można również zadzwonić b
z anonimowej funkcji, takich jak to:
b(sub { print "Hello World\n"; });
Nie można przekazać funkcję do innej funkcji bezpośrednio. Zamiast tego podajesz funkcję reference. Aby wywołać funkcję, którą usuniesz (jako odwołanie do CODE), używając ->()
;
sub a { print @_ }
sub b {
my $f = shift; # assuming that $f is a function reference...
$f->(@_); # call it with the remaining arguments
}
b(\&a, "hello, world!"); # prints "hello, world!"
Perl nie ma semantyki pass-by-name, ale można je emulować za pomocą skrótu. Metoda wywoływania funkcji jest taka sama. Usuwasz to.
sub a { print @_ }
sub b {
my %arg = @_;
$arg{function}->(@{$arg{arguments}});
}
b(function => \&a, arguments => ["hello, world!"]);
ObPerl6: Perl 6 będzie miał semantykę pass-by-name.
- 1. wywoływanie funkcji javascript okresowo
- 2. lista dynamicznych funkcji i dynamiczne wywoływanie ich.
- 3. Przesłanianie klas Extjs i wywoływanie funkcji callParent
- 4. Rcpp + inline - tworzenie i wywoływanie dodatkowych funkcji
- 5. Dynamiczne wywoływanie funkcji - Python
- 6. Automatyczne wywoływanie funkcji @IBAction
- 7. JavaScript samodzielne wywoływanie funkcji
- 8. Przekazywanie obiektu jako parametru do funkcji konstruktora i kopiowanie jego właściwości do nowego obiektu?
- 9. Przekazywanie obiektu do viewmodel
- 10. C#: Przekazywanie ogólnego obiektu
- 11. Przekazywanie obiektu klasy do jądra
- 12. Jquery wywoływanie funkcji zwrotnej w funkcji niestandardowej
- 13. Serializacja obiektu z podstawą i przekazywanie go do listy WebApi, która nie jest serializowana
- 14. Jak przerwać wywoływanie funkcji PowerShell
- 15. Funkcja wywoływanie dowolnej określonej funkcji
- 16. Wybierz zagnieżdżonego obiektu Array i zastąpić go
- 17. Przekazywanie struktury do funkcji
- 18. przekazywanie funkcji w nim
- 19. Przekazywanie ogólnej funkcji jako parametru
- 20. Parametr funkcji VIM Przekazywanie
- 21. Wywoływanie funkcji i śledzenie parametrów - przypadek testowy i generowanie próbne
- 22. wywoływanie tej samej funkcji nazwy
- 23. wywoływanie funkcji SQL z Blaze
- 24. wywoływanie funkcji javascript z php
- 25. wywoływanie funkcji Jquery z javascript
- 26. wywoływanie funkcji złożenia z c
- 27. Przekazywanie zmiennej globalnej do funkcji
- 28. Przekazywanie struktur do funkcji
- 29. React - przekazywanie obiektu przez rekwizyty
- 30. Przekazywanie obiektu do atrybutów HTML
Co, jeśli przekazywałbym funkcję jako część skrótu, to wyglądałby tak? $ args {function} ->(); – Kys
Dodałem przykłady tablic i skrótów. –
Ale co jeśli to było to: f (funkcja => \ &func); następnie w funkcji f, to byłoby to sub f { $ args {function} ->(); } – Kys