2009-07-02 7 views
1

Specman hat die apply() Methode void zurückzukehren die gleiche Aktion auf alle Elemente einer Liste auszuführen:„gelten()“ mit Methoden, die in Specman

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 habe:

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() kehrt void. 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?

Antwort

2

Ich denke, das grundlegende Problem hier ist, dass Sie apply() falsch verwenden möchten. Ich würde sagen, diese Funktion hat einige funktionale Programmierung Hintergrund und ihr Zweck ist, etwas zu tun, die jedes Element einer Liste und eine neue Liste (wie map in Python oder Perl) zurückgeben.

Wenn Sie die Nebenwirkungen eines Funktionsaufrufs interessiert, die Sie sind, wenn die Funktion keinen Wert zurückgibt, ist es korrekter, die explizite Schleife zu verwenden. Siehe auch Is there a value in using map() vs for?

Dies sagte ich kann im Moment nicht eine andere Lösung denken. Vielleicht wrappst du foo() in eine Wert-zurückkehrende Funktion, aber das scheint definitiv Überlastung.