OberonCore
https://forum.oberoncore.ru/

нормально ли, что можно объект1^ := объект2^ ?
https://forum.oberoncore.ru/viewtopic.php?f=22&t=6774
Страница 1 из 1

Автор:  budden [ Понедельник, 21 Июнь, 2021 20:41 ]
Заголовок сообщения:  нормально ли, что можно объект1^ := объект2^ ?

Примерно так:

Цитата:
TYPE o = OBJECT ... END;

VAR o1, o2 : o;

BEGIN
o1^ := o2^
END.


По смыслу всё содержимое объекта (включая все частные поля) копируется из o2 в о1. Хотя я делал это в методе o, может быть, вне методов o такое не скомпилируется - просто не пробовал.

Это фича или баг? Я не поручусь, что прямо все поля так присваиваются, но некоторые точно присваиваются :)

Автор:  Trurl [ Понедельник, 21 Июнь, 2021 22:00 ]
Заголовок сообщения:  Re: нормально ли, что можно объект1^ := объект2^ ?

А почему это может быть багом?

Автор:  budden [ Понедельник, 21 Июнь, 2021 22:36 ]
Заголовок сообщения:  Re: нормально ли, что можно объект1^ := объект2^ ?

Вот более содержательный пример:

Код:
MODULE DefO;

VAR schjotchik : SIZE;

TYPE o* = OBJECT
   VAR
   f* : SIZE;
   skrytoePole- : SIZE;
   
   PROCEDURE &new_o*();
   BEGIN
      skrytoePole := schjotchik;
      INC(schjotchik)
   END new_o;
   
END o;

END DefO.


Код:
MODULE Primer;

IMPORT DefO;

VAR o1, o2 : DefO.o;
   
PROCEDURE Do*();
BEGIN
NEW(o1);
NEW(o2);
ASSERT(o1.skrytoePole # o2.skrytoePole);
o2.f := 7;
o1^ := o2^;
TRACE(o1.skrytoePole = o2.skrytoePole);
END Do;

END Primer.

Primer.Do  ~


Печатает
Код:
{P cpuid= 0, pid= 8848 Primer.Do@159:(o1^.skrytoePole = o2^.skrytoePole)= TRUE; }


Протекла инкапсуляция, единственное, поле надо было назвать не „скрытым“, а „защищённым“.

Автор:  Александр Ильин [ Вторник, 22 Июнь, 2021 02:02 ]
Заголовок сообщения:  Re: нормально ли, что можно объект1^ := объект2^ ?

budden писал(а):
Протекла инкапсуляция
Ну, как бы с одной стороны вроде бы протекла, а с другой стороны вы просто склонировали объект и теперь у вас его две копии. Это надо просто иметь в виду как особенность системы - любой системы, где есть SYSTEM.MOVE, в общем-то. Так что уникальные идентификаторы должны быть основаны на указателях (каждый из которых как раз и является уникальным значением), а не на простых полях, чтобы в конечном итоге только сборщик мусора ими управлял.

В КП для таких случаев я публиковал только абстрактный класс и фабрику, а уникальное содержимое делал в расширенном типе, который не опубликован. Тогда такой трюк становится недоступен.

Автор:  Sergej Durmanov [ Вторник, 22 Июнь, 2021 05:19 ]
Заголовок сообщения:  Re: нормально ли, что можно объект1^ := объект2^ ?

OBJECT - синтаксический сахар над POINTER TO RECORD.

Автор:  budden [ Вторник, 22 Июнь, 2021 11:41 ]
Заголовок сообщения:  Re: нормально ли, что можно объект1^ := объект2^ ?

Спасибо, всё понял! А можно ли у указателя сделать "тело"?

Автор:  Wlad [ Вторник, 22 Июнь, 2021 13:18 ]
Заголовок сообщения:  Re: нормально ли, что можно объект1^ := объект2^ ?

budden писал(а):
Спасибо, всё понял! А можно ли у указателя сделать "тело"?

В смысле "тело указателя"?
"Тело указателя" может быть либо просто адресом, либо двумя адресами (метод и экземпляр/"контекст")
Вас - что интересует? Получение информации, на "какую сущность (какого типа) он сейчас указывает"? Или ещё какую-то "служебную информацию" получать хотите? :)

Автор:  Sergej Durmanov [ Вторник, 22 Июнь, 2021 15:18 ]
Заголовок сообщения:  Re: нормально ли, что можно объект1^ := объект2^ ?

budden писал(а):
Спасибо, всё понял! А можно ли у указателя сделать "тело"?
В первоначальномой версии языка, в которой не было OBJECT, так и было. Сейчас для этого есть объект.

Автор:  budden [ Вторник, 22 Июнь, 2021 19:50 ]
Заголовок сообщения:  Re: нормально ли, что можно объект1^ := объект2^ ?

Сергей меня понял. Имелся в виду безымянный составной оператор, который выполняется автоматически.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/