Как локально изменить свойство объекта параметров, не переопределяя его глобально

Предполагая решение C ++, вы можете использовать промежуточный сигнал, например следующий для # 2:

connect(thisWidget, SIGNAL(clicked()),
        thisWidget, SLOT(slotClickHandler()));

, затем:

void slotClickHandler()
{
   QString s = "my variable string here";

  emit sigDoSomething(s);
}

и их:

void slotDoSomething(const QString &s)
{
   // Do something interesting with s here

}

Обратите внимание, что этот фрагмент предполагает, что вы определили новый сигнал sigDoSomething(const QString &) и частный слот void slotDoSomething(const QString &).

0
задан forestkelley 24 February 2019 в 04:38
поделиться

1 ответ

Проблема в том, что вы каждый раз переназначаете объект options, поскольку объекты являются ссылочными типами. Даже если бы вы сделали что-то подобное в своей функции: newOptions = options вы бы все равно ссылались на ваш старый объект options, и любые изменения в «новом» объекте newOptions также изменили бы объект options.

Однако, если вы хотите получить точно такой же объект и изменить его, не затрагивая другой, вы должны клонировать его. Вы можете добиться этого в JavaScript с помощью метода Object.create(). Вы можете прочитать больше об этом здесь .

Таким образом, весь ваш код будет выглядеть так:

var options = {x: 10}
console.log(options.x + ' original options object');

cat(options);
function cat(options) {
  newOptions = Object.create(options);
  newOptions.x = 3;
  x = newOptions.x;
  console.log(x + ' cat = 3'); // this should equal 3
  mouse(x);
}

dog(options);

function dog(options) {
  newOptions = Object.create(options);
  newOptions.x = 7;
  x = newOptions.x;
  console.log(x + ' dog = 7'); // this should equal 7
  mouse(x);
}

// SHARED FUNCTION
function mouse(x) {
  console.log(x + ' mouse = cat() and/or dog()'); // I want this to equal 3 for cat() and 7 for dog() just as it is with x defined inside cat() and dog().
}

console.log(options.x + ' final global scope check = 10'); // I want this to remain 10, not 3. But the changes in cat() are poluting the global definition of options.x.
0
ответ дан marc_s 24 February 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: