использование «apply()» с методами, которые возвращают void в specman
Вопрос
У Спекмана есть apply()
метод для выполнения одного и того же действия со всеми элементами списка:
var a: list of int;
a = somefunction.that.returns.list.of.int();
var b:= a.apply(it * 2);
Где apply()
делает то же самое, что:
for each in a {
b.add(it.*2);
};
Теперь, если я хочу вызвать метод для элементов a
, Я могу использовать apply()
пока метод возвращает значение.Однако, если у меня есть:
struct bar {
x: int;
foo() is {
message(LOW, "x is ", x);
};
};
И я пытаюсь сделать:
var a: list of bar;
a = somefunction.that.returns.list.of.bar();
a.apply(it.foo());
Он не компилируется, потому что foo()
возвращает void
.Вместо этого мне нужно использовать явный цикл:
for each in a {
it.foo();
};
Есть ли в specman метод, похожий на apply()
это не требует возвращаемого значения?
Решение
Я думаю, что основная проблема здесь в том, что вы хотите неправильно использовать apply()
.Я бы сказал, что эта функция имеет некоторые функциональное программирование фон и его цель — сделать что-то, что касается каждого элемента списка, и вернуть новый список (например map
на Python или Perl).
Если вы заинтересованы в побочные эффекты вызова функции, что вы и делаете, если функция не возвращает значение, правильнее использовать явный цикл.Смотрите также Есть ли смысл использовать map() и for?
Это говорит о том, что я не могу придумать другого решения на данный момент.Возможно, упаковка foo()
в функции, возвращающей значение, но это определенно кажется перегрузкой.