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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top