Frage

Specman hat die apply() Methode die gleiche Aktion auf alle Elemente einer Liste ausführen:

var a: list of int;
a = somefunction.that.returns.list.of.int();
var b:= a.apply(it * 2);

Wo apply() macht das gleiche wie:

for each in a {
    b.add(it.*2);
};

Nun, wenn ich eine Methode auf die Elemente von a nennen wollen, kann ich apply() verwenden, solange die Methode einen Wert zurückgibt. Allerdings, wenn ich:

struct bar {
    x: int;

    foo() is {
       message(LOW, "x is ", x); 
    };
};

Und ich versuche zu tun:

var a: list of bar;
a = somefunction.that.returns.list.of.bar();
a.apply(it.foo());

Es ist nicht kompilieren, weil foo() void zurückgibt. Stattdessen muss ich eine explizite Schleife verwenden:

for each in a {
    it.foo();
};

Gibt es eine Methode in Specman ähnlich wie apply(), die keinen Rückgabewert benötigt?

War es hilfreich?

Lösung

Ich denke, das grundlegende Problem hier ist, dass man zu falschem Gebrauch apply() will. Ich würde sagen, diese Funktion hat einig funktionale Programmierung Hintergrund und ihr Zweck ist etwas, das jedes Element einer Liste zu tun und zurück eine neue Liste (wie map in Python oder Perl) .

Wenn Sie interessieren sich für die Nebenwirkungen von einem Funktionsaufruf, der Sie sind, wenn die Funktion keinen Wert zurückgibt, dessen richtiger die explizite Schleife zu verwenden. Siehe auch Gibt es einen Wert im Umgang mit Karte () vs für?

Das sagte ich nicht von einer anderen Lösung im Moment denken. Vielleicht foo() in einer Wert-Rückkehr Funktion Einwickeln aber dies scheint definitiv Überlastung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top