Thread sub mit statischem Speicher (28 answers)
Opened by worst_case at 2019-01-26 20:27

haj
 2019-01-27 12:36
#189621 #189621
User since
2015-01-07
527 Artikel
BenutzerIn

user image
2019-01-27T09:41:09 worst_case
Closure geht nicht, da ich ab dem 2. Aufruf die Parameter der Funktion nicht mehr verändern kann.

Da vermute ich, dass Du die Möglichkeiten von Closures unterschätzt :)

2019-01-27T09:41:09 worst_case
my_funktion1(1,100) 1=starte inkrement bis hundert
my_funktion2(1,300) 0=stoppe inkrement bis hundert
my_funktion3(1,100) 1=starte wieder vom internen Wert (state)
inkrement bis hundert

Bei diesen Konstruktionen ist mir nicht klar, was sie bedeuten sollen. Ist "1=starte inkrement bis hundert" ein weiterer Übergabeparameter? Oder das Resultat von my_funktion1(1,100)? Warum soll my_funktion2(1,300) 0=stoppe inkrement bis hundert ein Inkrement bis 100 stoppen?

Hier mal ein etwas längeres Beispiel, bei dem ich Zähler erzeuge. Jeder Zähler hat seinen eigenen Wert, kann mit einem Parameter angehalten und wieder beendet werden, und und zählt bis zu einem Endwert.

more (7.8kb):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use 5.010;
use strict;
use warnings;

sub make_counter {
    my $end = shift;

    return sub {
        my $aktion = shift;
        state $wert      = 0;
        state $gestartet = 1;

        defined $aktion  and  $gestartet = $aktion;

        my $name = "Z$end";
        if ($wert >= $end) {
            say "$name: Wert = $wert (beendet)";
        }
        elsif ($gestartet) {
            $wert++;
            say "$name: Wert = $wert";
        }
        else {
            say "$name: Wert = $wert (angehalten)";
        }
    }
}

my $funktion1 = make_counter(3);
my $funktion2 = make_counter(2);

$funktion1->();    # Z3: Wert = 1
$funktion1->();    # Z3: Wert = 2
$funktion2->();    # Z2: Wert = 1
$funktion1->(0);   # Z3: Wert = 2 (angehalten)
$funktion2->();    # Z2: Wert = 2
$funktion1->();    # Z3: Wert = 2 (angehalten)
$funktion1->(1);   # Z3: Wert = 3
$funktion2->(1);   # Z2: Wert = 2 (beendet)
$funktion1->();    # Z3: Wert = 3 (beendet)
$funktion1->(0);   # Z3: Wert = 3 (beendet)

View full thread sub mit statischem Speicher