utilizzando “apply ()” con i metodi che restituiscono vuoto in Specman
Domanda
Specman ha il metodo apply()
per eseguire la stessa azione su tutti gli elementi di una lista:
var a: list of int;
a = somefunction.that.returns.list.of.int();
var b:= a.apply(it * 2);
Dove a
fa lo stesso come:
for each in a {
b.add(it.*2);
};
Ora, se voglio chiamare un metodo su elementi di foo()
, posso usare void
fintanto che il metodo restituisce un valore. Tuttavia, se ho:
struct bar {
x: int;
foo() is {
message(LOW, "x is ", x);
};
};
E io cerco di fare:
var a: list of bar;
a = somefunction.that.returns.list.of.bar();
a.apply(it.foo());
E non si compila, perché i rendimenti <=> <=>. Invece, devo usare un ciclo esplicito:
for each in a {
it.foo();
};
Esiste un metodo in Specman simile a <=> che non richiede un valore di ritorno?
Soluzione
Credo che il problema di fondo è che si desidera uso improprio apply()
. Direi che questa funzione ha qualche programmazione funzionale di fondo e il suo scopo è quello di fare una cosa che ogni elemento di una lista e restituisce un nuovo (come map
in Python o Perl).
Se siete interessati a effetti collaterali di una chiamata di funzione, che si è se la funzione non restituisce un valore, il suo più corretto utilizzare il ciclo esplicito. Vedere anche C'è un valore in usando la mappa () vs per?
Detto questo non riesco a pensare a una soluzione diversa al momento. Forse avvolgendo foo()
in una funzione di valore di ritorno ma questo sembra decisamente sovraccarico.