У меня возникла ситуация, когда я определил пару переменных экземпляра на уровне модуля, используя идентификатор области «private». Мне нужно сделать это, потому что эти переменные будут использоваться в нескольких функциях внутри модуля. Кроме того, некоторые из этих переменных являются «списками» или «наборами». Я понял, что значения этих переменных сохраняются между повторными вызовами определенной функции внутри модуля. Это так, как ожидалось.удаление элементов из списка и/или набора
Я также создаю тест, в котором я неоднократно вызываю одну из функций. Я бы предпочел иметь новую копию переменных экземпляра (как и с экземплярами экземпляра на Java). Я не могу это сделать. Если я пытаюсь свести к нулю содержание списка/набор, я получаю в беду следующим образом:
module foo::bar
private set[DataType_1] data1;
public void nullifyInstanceVars()
{
//tried
data1={}
}
//method that gets called repeatedly:
public void repeatCallMe(..)
{
nullifyInstanceVars();
...
..
//Throws an error like: trying to add an element of type 1 to set[void]
data1 += anElementOfType1
}
Итак, я изменил nullifyInstanceVars() метод установили [DataType1] data1 = {}. Это не работает, потому что я считаю, что просто создает новую переменную, ограниченную только внутри функции, и на самом деле не очищает элемент!
Любая помощь приветствуется ...
См. Https://github.com/cwi-swat/rascal/issues/718 –
Ahhh .. ну, я нашел работу вокруг, и, кроме того, мой сценарий стал более запутанным, чем мне удобнее разгадать его государство. Тем временем я понял, что существуют другие переменные экземпляра, где я явно инициализирую, как вы рекомендуете; и они никогда не сообщали о каких-либо ошибках. Таким образом, это должно быть так, как вы предложили. Спасибо ... –
Кроме того, попробуйте вместо этого сказать data1 = data1 + anElementOfType1, я заметил это раньше, но это немного непредсказуемо, когда это произойдет. –