Как скопировать прямоугольник в Dart

У меня есть два прямоугольника, один из которых иногда сбрасывается на другой прямоугольник. В С++ я бы просто сделал:

_rect = _resetRect;

Но в Dart это на самом деле означает, что _rect теперь относится к тому же объекту, что и _resetRect, а это не то, что мне нужно.

Мое текущее решение таково:

_rect.left = _resetRect.left;
_rect.width = _resetRect.width;
_rect.top = _resetRect.top;
_rect.height = _resetRect.height;

Это идиотизм. Другие вопросы предполагает, что нет встроенного способа копирования объектов (как в C++), и вы должны полагаться на объект, предоставляющий метод clone(). Но у Rectangle его нет, что мне делать?

Кроме того, даже если бы у него был метод clone(), разве он не выделял бы совершенно новый Rectangle, а не просто устанавливал поля существующего (как в C++ operator=), и, следовательно, был бы менее эффективным?

0
0
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

C++ также не имеет способа глубокого копирования объекта, который содержит указатели/ссылки на другие объекты. В Dart все значения являются ссылками, поэтому это ограничение применяется ко всем объектам.

Я предполагаю, что это MutableRectangle, так как Rectange в dart:math не поддается изменению. У этого класса действительно нет способа клонировать значения другого прямоугольника, поэтому вам нужно скопировать каждое из них. Я бы использовал каскад для этого:

_rect
  ..left = _resetRect.left
  ..top = _resetRect.top
  ..width = _resetRect.width
  ..height = _resetRect.height;

В качестве альтернативы, если это происходит достаточно часто, вы можете создать вспомогательную функцию:

void copyRectangle(MutableRectangle target, Rectangle source) {
   target
     ..left = source.left
     ..top = source.top
     ..width = source.width
     ..height = source.height;
}

Ну это отстой. :-/ Между прочим (я уверен, что вы знаете это, но для других людей, читающих), C++ имеет способ глубокого копирования объекта, который содержит указатели и ссылки - вам просто нужно определить пользовательские конструкторы копирования для клонирования ссылки объекты должным образом.

Timmmm 02.05.2019 12:37

Другие вопросы по теме