У меня есть два прямоугольника, один из которых иногда сбрасывается на другой прямоугольник. В С++ я бы просто сделал:
_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=), и, следовательно, был бы менее эффективным?
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++ имеет способ глубокого копирования объекта, который содержит указатели и ссылки - вам просто нужно определить пользовательские конструкторы копирования для клонирования ссылки объекты должным образом.