Pergunta

Specman tem o método apply() para executar a mesma ação em todos os elementos de uma lista:

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

Onde apply() faz o mesmo que:

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

Agora, se eu quiser chamar um método nos elementos de a, posso usar apply() desde que o método retorna um valor. No entanto, se eu tenho:

struct bar {
    x: int;

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

E eu tento fazer:

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

Ele não compilar, porque foo() retornos void. Em vez disso, eu tenho que usar um loop explícita:

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

Existe um método em Specman semelhante ao apply() que não requer um valor de retorno?

Foi útil?

Solução

Eu acho que o problema básico aqui é que você quer mis-use apply(). Eu diria que esta função tem algum programação funcional fundo e sua finalidade é fazer algo que cada item de uma lista e retornar um new lista (como map em Python ou Perl) .

Se você está interessado no lado efeitos de uma chamada de função, o que você é, se a função não retorna um valor, é mais correto usar o loop explícita. Veja também Existe um valor na utilização do mapa () vs para?

Este disse que eu não consigo pensar em uma solução diferente no momento. Talvez envolvendo foo() em uma função que retorna valor, mas isso definitivamente parece sobrecarga.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top