Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.180.32] |
|
Страницы: (56) « Первая ... 41 42 [43] 44 45 ... 55 56 ( Перейти к последнему сообщению ) |
Сообщ.
#631
,
|
|
|
Цитата applegame @ Нет. Как уже сказал D_KEY, = скопирует указатель и будет прав. Если мне нужно скопировать его содержимое, то я и напишу соответственно, сразу же указав параметром не T, а T*, и копировать буду источником разыменованный аргумент, а не его самого.Дак в плюсах тоже самое: для указателей нужно вызывать clone, а для неуказателей =. Единая семантика – либо значений, либо ссылок – тем и хороша, что я всегда знаю, с чем работаю, и если мне требуется разное поведение для значений/ссылок/указателей, я это легко сделаю либо перегрузкой, либо специализацией. В Плюсах принята семантика значений, но при этом я любой тип легко могу объявить ссылочным простым &. Не всегда это может быть удобно, но альтернатива хуже. Если бы была принята семантика ссылок, то и тут проблемы бы не было, наверняка был бы единый способ явно разыменовать ссылку, чтобы достучаться до хранилища объекта. В случае смешанной семантики у меня нет иного выбора, кроме как ветвиться метакодом, т.к. под T может скрываться и значение, и ссылка, и что конкретно придёт в мой обобщённый код в некой конкретной точке его инстанцирования, я заранее знать никак не могу. |
Сообщ.
#632
,
|
|
|
Ну тогда объясни, что хотел оппонент и зачем он упомянул clone().
Тоже самое в D. Для более легкого понимания, представь, что класс в D - это просто особый тип указателя, например shared_ptr. Добавлено Цитата Qraizer @ А clone() тогда зачем упомянул? То ли хотел сбить меня с толку, то ли решил мгновенно на другие рельсы перепрыгнуть.Нет. Как уже сказал D_KEY, = скопирует указатель и будет прав. Цитата Qraizer @ Я тебя не понимаю. Зачем ветвиться? Просто делай присваивание, скопируется обычный указатель или указатель на класс или значение. Никаких ветвлений. В случае смешанной семантики у меня нет иного выбора, кроме как ветвиться метакодом, |
Сообщ.
#633
,
|
|
|
Цитата applegame @ Тоже самое в D. Для более легкого понимания, представь, что класс в D - это просто особый тип указателя, например shared_ptr. Представить я могу все, что угодно. Но в системе типов D для классов сделано исключение |
Сообщ.
#634
,
|
|
|
Цитата D_KEY @ Это не исключение, это ещё один самостоятельный тип. Ты же не называешь указатели исключением. Но в системе типов D для классов сделано исключение Единственная претензия, пожалуй, это то, что выглядит оно как передача по значению, а передается указатель. |
Сообщ.
#635
,
|
|
|
Цитата applegame @ скопируется обычный указатель или указатель на класс или значение. Есть тип T. В C++ не важно, какого этот тип "вида"(метатипа?). В приведенном выше коде будет создана копия значения этого типа. Если мы хотим сделать указатель на этот тип, мы делаем T* или там shared_ptr<T>. В D же, если это класс, то поведение будет отличаться от поведения для всех остальных "видов" типа. В частности, не будет иметь смысл T*. |
Сообщ.
#636
,
|
|
|
Qraizer, ну не понимает он, что ссылка на объект и сам объект это не одно и то же.
applegame, к примеру, иногда в функции, чтобы получить результат, необходимо "поиграться" с состоянием объекта. Например, объект у тебя притворяется числом (представляет дробь или является числом высокой точности, или ещё что-нибудь в этом роде). К при меру число это представляет собой угол (в градусах), и тебе необходимо загнать его в интервал ±180°. Простейший способ — прибавлять/вычитать 360, но чтобы не испортить состояние исходного объекта, ссылку на который ты передал, тебе лучше бы работать с копией. Если ты передаёшь целое или вещественное (встроенный тип), то простое = создаёт тебе копию, с которой ты можешь спокойно манипулировать. Если ты передаёшь числовой объект, то = просто создаёт ещё одну ссылку и все манипуляции отражаются на исходном объекте, портя его. Можно конечно вместо конструкции a += 360 использовать a = a + 360, каждый раз создавая новый объект, но это резко снижает эффективность, поскольку начинаются игры с распределением/освобождением памяти. Поэтому хотелось бы иметь независимый от сущности способ получить её копию. В C++ такой способ есть (их даже несколько), в D, я так понял, нет. В том же Python'е есть функция copy, которая возвращает копию объекта, независимо от того, встроенный это тип или объект, созданный пользователем. Там даже есть функция deepcopy, создающая независимые копии ещё и вложенных объектов. Правда она медленная. В принципе, достаточно написать одну такую функцию и потом ей пользоваться, где понадобится копия. |
Сообщ.
#637
,
|
|
|
Цитата applegame @ Цитата D_KEY @ Это не исключение, это ещё один самостоятельный тип. Ты же не называешь указатели исключением. Но в системе типов D для классов сделано исключение Так они и не являются исключением. А класс в D является. |
Сообщ.
#638
,
|
|
|
Цитата D_KEY @ И чем же он будет отличаться? Будет создана копия значения этого типа, а именно типа класс такой-то. В приведенном выше коде будет создана копия значения этого типа. Если мы хотим сделать указатель на этот тип, мы делаем T* или там shared_ptr<T>. В D же, если это класс, то поведение будет отличаться от поведения для всех остальных "видов" типа. Цитата D_KEY @ В D будет. Получится нечто похожее на плюсовой T**. В частности, не будет иметь смысл T* |
Сообщ.
#639
,
|
|
|
Цитата amk @ Qraizer, ну не понимает он, что ссылка на объект и сам объект это не одно и то же. applegame, к примеру, иногда в функции, чтобы получить результат, необходимо "поиграться" с состоянием объекта. Например, объект у тебя притворяется числом (представляет дробь или является числом высокой точности, или ещё что-нибудь в этом роде). К при меру число это представляет собой угол (в градусах), и тебе необходимо загнать его в интервал ±180°. Простейший способ — прибавлять/вычитать 360, но чтобы не испортить состояние исходного объекта, ссылку на который ты передал, тебе лучше бы работать с копией. Если ты передаёшь целое или вещественное (встроенный тип), то простое = создаёт тебе копию, с которой ты можешь спокойно манипулировать. Если ты передаёшь числовой объект, то = просто создаёт ещё одну ссылку и все манипуляции отражаются на исходном объекте, портя его. Можно конечно вместо конструкции a += 360 использовать a = a + 360, каждый раз создавая новый объект, но это резко снижает эффективность, поскольку начинаются игры с распределением/освобождением памяти. Поэтому хотелось бы иметь независимый от сущности способ получить её копию. В C++ такой способ есть (их даже несколько), в D, я так понял, нет. В том же Python'е есть функция copy, которая возвращает копию объекта, независимо от того, встроенный это тип или объект, созданный пользователем. Там даже есть функция deepcopy, создающая независимые копии ещё и вложенных объектов. Правда она медленная. В принципе, достаточно написать одну такую функцию и потом ей пользоваться, где понадобится копия. Не то, чтобы я тут был за кого-то. Но в качестве примера, где мешает ссылочная семантика приведён пример говнокода В данном сценарии я скорее за семантику, которая не одобряет такое поведение |
Сообщ.
#640
,
|
|
|
Цитата amk @ Ты издеваешься? Я тебе не Исмаил Прокопенко, я отлично разбираюсь и в указателях и ссылках и значениях. В D также существует передача по значению и по ссылке, правда самостоятельного типа "ссылка" не существует. Ты мне тут лекции по плюсам для детского сада не читай. У нас тут скорее философский диспут, а не спор о тонкостях работы типов. Qraizer, ну не понимает он, что ссылка на объект и сам объект это не одно и то же. |
Сообщ.
#641
,
|
|
|
Цитата D_KEY @ Есть тип T. В C++ не важно, какого этот тип "вида"(метатипа?). В приведенном выше коде будет создана копия значения этого типа. Если мы хотим сделать указатель на этот тип, мы делаем T* или там shared_ptr<T>. В D же, если это класс, то поведение будет отличаться от поведения для всех остальных "видов" типа. В частности, не будет иметь смысл T*. На самом деле в С++, с нововведениями их последних стандартов, система типов превратилась тоже в неочевидную. И теперь приходится учитывать много ньюансов. Я про все эти rvalue/lvalue ссылки. |
Сообщ.
#642
,
|
|
|
Цитата KILLER @ Цитата D_KEY @ Есть тип T. В C++ не важно, какого этот тип "вида"(метатипа?). В приведенном выше коде будет создана копия значения этого типа. Если мы хотим сделать указатель на этот тип, мы делаем T* или там shared_ptr<T>. В D же, если это класс, то поведение будет отличаться от поведения для всех остальных "видов" типа. В частности, не будет иметь смысл T*. На самом деле в С++, с нововведениями их последних стандартов, система типов превратилась тоже в неочевидную. И теперь приходится учитывать много ньюансов. Я про все эти rvalue/lvalue ссылки. Согласен. Ссылки изначально были не логичны. Сейчас все стало совсем плохо. |
Сообщ.
#643
,
|
|
|
Цитата D_KEY @ Согласен. Ссылки изначально были не логичны. Сейчас все стало совсем плохо. По крайней мере там все было очевидно и предсказуемо, а теперь совсем беда. Особенно с универсальными ссылками. |
Сообщ.
#644
,
|
|
|
Не, ну оно понятно и юзабельно. Но через гланды.
|
Сообщ.
#645
,
|
|
|
Если вы пишете обобщенную функцию, принимающий любой тип, включая указатели, то для создания копии экземпляра вам придется, как выразился Qraizer, ветвить код, например писать отдельные оверлоады или шаблоны для значений и для указателей. То же самое в D, вам придется ветвиться, но на один тип больше - классы. Важно заметить, что классы в D не похожи на ссылки в плюсах, они похожи именно на указатели.
Добавлено Цитата D_KEY @ не вижу оснований называть это исключением. Например shared_ptr иммитирует ссылочную семантику, но никто не называет его исключением. Так они и не являются исключением. А класс в D является. Добавлено Цитата negram @ Интересно. Назови-ка мне независимый способ получения копии экземпляра объекта в плюсах. Скажем, я передал указатель и нужно создать копию объекта, на который этот указатель указывает. Поэтому хотелось бы иметь независимый от сущности способ получить её копию. В C++ такой способ есть (их даже несколько), |