2009-07-02 5 views
1

Specman a la méthode apply() pour effectuer la même action sur tous les éléments d'une liste:utilisant « appliquer() » avec des méthodes qui renvoient vide dans specman

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

Lorsque apply() fait la même chose que:

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

Maintenant, si je veux appeler une méthode sur les éléments de a, je peux utiliser apply() tant que la méthode renvoie une valeur. Cependant, si j'ai:

struct bar { 
    x: int; 

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

Et j'essaie de faire:

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

Il ne compile pas, parce que foo() retours void. Au lieu de cela, je dois utiliser une boucle explicite:

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

Y at-il une méthode similaire à specman apply() qui ne nécessite pas une valeur de retour?

Répondre

2

Je pense que le problème de base est que vous voulez utiliser apply(). Je dirais que cette fonction a quelque programmation fonctionnelle fond et son but est de faire quelque chose qui chaque élément d'une liste et de retourner une nouvelle liste (comme map en Python ou Perl).

Si vous êtes intéressé par les effets secondaires d'un appel de fonction, que vous êtes si la fonction ne renvoie pas de valeur, il est plus correct d'utiliser la boucle explicite. Voir aussi Is there a value in using map() vs for?

Cela dit, je ne peux pas penser à une solution différente pour le moment. Peut-être l'emballage foo() dans une fonction de retour de valeur, mais cela semble définitivement surcharge.

Questions connexes