использование «apply()» с методами, которые возвращают void в specman

StackOverflow https://stackoverflow.com/questions/1072818

  •  21-08-2019
  •  | 
  •  

Вопрос

У Спекмана есть 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() в функции, возвращающей значение, но это определенно кажется перегрузкой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top