@dlangru

Страница 424 из 719
Dark
03.03.2018
13:59:12
Аа, понял

Evgeny
03.03.2018
14:01:37
В целом если замыканий нет, то this.outer равен null, то есть компилятор достаточно умен. чтобы не захватывать контекст

но накой он вообще создает поле this.outer?

впрочем это такой мелкий оверхед, что можно не парится, но лучше static вставить

Google
Dark
03.03.2018
14:04:16
Одним полем меньше?

Evgeny
03.03.2018
14:07:53
ага, ну и защита от ошибки. мало ли случайно замыкание сделаешь :)

Dark
03.03.2018
14:08:32
Короткое замыкание причем

Evgeny
03.03.2018
14:12:57
аж искрит

Xessao
03.03.2018
14:29:09
ага, эдакий костыль
Это не костыль, далеко не костыль. Дружественные функции, к примеру, довольно полезны при перегрузки бинарных операций (<<, >>, +, -, etc.) и при написании юнит-тестов. Если примеров мало, то другие можешь посмотреть в книге Бьёрна Страуструпа "Язык программирования С++".

Evgeny
03.03.2018
14:29:42
местами без них трудно

но по сути это костыль, которого удачно избежали в D

реальные костыли тоже очень полезны... для инвалидов. но лучше все же когда они не нужны, верно?

Xessao
03.03.2018
14:32:59
Давай мы не будем устраивать холивар на эту тему, хорошо?

Evgeny
03.03.2018
14:34:04
Давай мы не будем устраивать холивар на эту тему, хорошо?
это не холивар. не надо путать полезность и костыльность

костыли полезны почти всегда

Меня сначала обескуражила иная система приватности после перехода с плюсов на D. Но стоило немного подумать и стало очевидно, что так намного лучше. Наконец-то никаких дебильных френд-функций

Google
Evgeny
03.03.2018
14:37:11
Кстати, "Язык программирования С++" сильно устарела. Я по ней учил C++ на первом курсе, в 1995 году

По мне так Страуструп ваще не авторитет

Dark
03.03.2018
14:48:04
Не, он авторитет. В С++. А у нас тут D, так что тут он не авторитет

Но вообще, соглашусь с Eugene: костыльность это одно, а полезность это другое. И это даже не взаимоисключающие понятия

Evgeny
03.03.2018
14:53:59
Dark
03.03.2018
14:55:15
Ну, лично для меня, он и в C++ не авторитет.
А кто для тебя авторитет тогда?

Evgeny
03.03.2018
15:18:20
Для меня особо авторитетов нет, я стараюсь сам анализировать инфу. В C++ прислушиваюсь к Саттеру и Мейерсу, немножко к Александреску.

Страуструпа уважаю как создателя C++, но его взгляды на развитие C++ мне представляются несколько старперскими.

например, он зарезал static if

но это мой личный взгляд, я никому его не навязываю.

Dark
03.03.2018
17:34:33
Страуструпа уважаю как создателя C++, но его взгляды на развитие C++ мне представляются несколько старперскими.
Мне тоже. Вообще, плюсы на мой взгляд, едут в дальнейшее усложнение языка, а не его элегантности, выразительности и простоты

Valeriy
03.03.2018
17:52:18
тривиальный конструктор или таки конструктор по-умолчанию?
Я имел ввиду конструктор без аргументов. В моём понимании конструкторы по умолчанию — это не только конструктор без аргументов (тривиальный), но и копирующий конструктор и конструктор переноса (на знаю есть ли он в D)

Почему так думаешь?
Ну самый простой способ выяснить баг это или выпилилил из языка

Потому что T.init должно быть известно во время компиляции без исполнения дополнительного кода. (Если правильно помню.)
Это не оправдыывает запрет на конструктор без аргументов. Например struct A { void * _ptr = null; ... } Значение для инициализации определено. Но я не могу определить конструктор, для того что бы присвоить _ptr какое то осмысленное значение. По-моему нелогично.

Igor
03.03.2018
18:00:18
возможно тут работает логика что .init и дефолтный конструктор должны иметь одно и то-же поведение и следовательно достаточно .init

Valeriy
03.03.2018
18:00:28
Т.е. структура даже во время компиляции должна ссылаться на что-то?
Не понял вопрос. В моём примере у указателья есть значение во время компиляции: нулевой указатель. Потом в конструкторе я хотел бы переопределить одно из полей. Не вижу проблем.

Вот тут нашёл решение: https://forum.dlang.org/post/ealzckbomansfskupdoj@forum.dlang.org предлагают создать класс и разместить его на стеке. С помощью шаблона scoped

Google
Pavel
03.03.2018
18:10:18
Так можно же при объявлении структуры проинициализировать ее поля

S mystruct = {a:6}

Valeriy
03.03.2018
18:11:05
У меня где то в коде на С или С++ есть функции для создания/удаления и манипулирования объектом. я хочу их обернуть в коде на D вот так private extern (C) { void * make_a(); void del_a(void *a); void a_meth(void *a); } struct A { private: void *_ptr; public: this() { _ptr = make_a(); } ~this() { del_a(_ptr); } void meth() { _ptr.a_meth(); } }

Вот так не скомпилится: struct A { void *_ptr = make_a(); ... }

Eto
03.03.2018
18:14:31
init() добавить.

Valeriy
03.03.2018
18:14:32
А из-за этого странного ограничения я вынужден делать так: private class A { private: void *_ptr; public: this() { _ptr = make_a(); } ~this() { del_a(_ptr); } void meth() { _ptr.a_meth(); } } public alias DA = scoped!A;

init() добавить.
Не, костыль же.

Eto
03.03.2018
18:15:31
Это один из тех случаев, когда приходя в новый язык, люди приносят с собой свои старые подходы.

Valeriy
03.03.2018
18:16:43
Это один из тех случаев, когда приходя в новый язык, люди приносят с собой свои старые подходы.
Ну может быть. Не спорю, что не постиг ещё все особенности языка :) Но init() выглядит ещё большим костылём чем scoped

Valeriy
03.03.2018
18:17:58
Засоряет клиентский код.

Dark
03.03.2018
18:18:01
А scoped что делает?

Valeriy
03.03.2018
18:18:18
А scoped что делает?
https://dlang.org/library/std/typecons/scoped.html

Pavel
03.03.2018
18:18:25
Да я помню мне как то это понадобилось. Но вроде я легко обошел.

Valeriy
03.03.2018
18:18:42
А scoped что делает?
На стеке аллоцирует класс

Pavel
03.03.2018
18:19:45
Уже забыл :) но, вроде я что то типа фабрики сделал

Функция которая возвращает подготовленную структуру

Google
Valeriy
03.03.2018
18:20:15
Eto
03.03.2018
18:20:59
Засоряет клиентский код.
Это всё субъективно. Вы гонитесь за тем, что.. важно ли?

Dark
03.03.2018
18:22:04
Это всё субъективно. Вы гонитесь за тем, что.. важно ли?
Тут уж все зависит от задач. Трудно написать "быстро, дешево и хорошо"(с)

Valeriy
03.03.2018
18:22:33
Это всё субъективно. Вы гонитесь за тем, что.. важно ли?
Люблю когда в клиентском коде все прозрачно и предсказуемо. А init() — это дополнительные соглашения. Объекты моей структуры надо создавать не как обычно, а через статическую функцию. Код загрязняется. Можно так делать, но не элегантно.

Dark
03.03.2018
18:24:10
Аллоцировать класс на стеке может быть небезопастно, не?

О, начали сворачивать внутри std в доках. Удобнее стало

Valeriy
03.03.2018
18:25:12
Аллоцировать класс на стеке может быть небезопастно, не?
Вот не знаю как она внутри устроена. Но я думаю там что-то вроде placement new т.е. вполне безопасно

Valeriy
03.03.2018
18:26:31
Eto
03.03.2018
18:26:33
Люблю когда в клиентском коде все прозрачно и предсказуемо. А init() — это дополнительные соглашения. Объекты моей структуры надо создавать не как обычно, а через статическую функцию. Код загрязняется. Можно так делать, но не элегантно.
Прозрачно и предсказуемо. Но в то же время вы скрываете операции в конструкторах по умолчанию. Т.е. другим разработчикам нужно обязательно знать конструкторы в каждом типе, иначе для них код не прозрачен.

Dark
03.03.2018
18:26:35
Лично я бы сделал выбор в лишнее соглашение, чем рисковал бы вылетами

О, 2.079 вышла

Интересно, где можно прочитать чейнджлог?

Maxim
03.03.2018
18:31:08
https://dlang.org/changelog/2.079.0.html



Valeriy
03.03.2018
18:33:14
Прозрачно и предсказуемо. Но в то же время вы скрываете операции в конструкторах по умолчанию. Т.е. другим разработчикам нужно обязательно знать конструкторы в каждом типе, иначе для них код не прозрачен.
Так зачем им знать что там в конструкторе длеается? Библиотечный код предоставляет интерфейс, клиентский код его использует. А детали реализации клиентского кода не касаются.

Maxim
03.03.2018
18:33:36
о, @nogc исключения подвезли, отлично)

Igor
03.03.2018
18:35:15
круто!

Google
Eto
03.03.2018
18:43:56
Так зачем им знать что там в конструкторе длеается? Библиотечный код предоставляет интерфейс, клиентский код его использует. А детали реализации клиентского кода не касаются.
Вопрос насколько этот код "оптимизирован". Насколько быстро вы его придумали, и как быстро написали. Проблемен ли он. Придётся ли к нему вернуться из-за багов, проблем с производительностью или же просто добавления новой функциональности. Как быстро вы будете изучать его, если таки придётся вернуться. Если при этом подходе вы затратите меньше времени, чем при предложенными нами. То очевидно, что ваш подход лучше.

Dark
03.03.2018
18:44:59
Меньше времени где? В разработке или в рантайме?

Evgeny
03.03.2018
18:47:41
Я имел ввиду конструктор без аргументов. В моём понимании конструкторы по умолчанию — это не только конструктор без аргументов (тривиальный), но и копирующий конструктор и конструктор переноса (на знаю есть ли он в D)
Конструктор без параметров и конструктор по умолчанию - это одно и то же. Тривиальный конструктор, в терминах C++ - это конструктор, который ничего не делает. Конструктор без параметров (по умолчанию) может быть как тривиальным, так и нетривиальным.

В C++ классы могут быть PODами, а могут и не быть. В D структуры - это всегда POD-ы, поэтому они не могут иметь нетривиальных конструкторов по умолчанию и конструкторов копирования.

а также виртуальных методов.

Компилятор может перемещать (move) структуры тупым memcpy не вызывая вообще никаких методов.

Dark
03.03.2018
18:53:40
В С++ и структуры POD'ы

Evgeny
03.03.2018
18:54:38
В С++ и структуры POD'ы
Нет. В C++ структуры - это классы с видимостью членов по умолчанию public. больше они ничем от классов не отличаются.

Dark
03.03.2018
18:55:26
Т.е. они могут содержать методы?

О.о

Получается, что да

Кажется я больше писал на С, чем на С++

Даже не знаю, радоваться или грустить

Evgeny
03.03.2018
18:58:04
Т.е. они могут содержать методы?
они могут все, вплоть до наследования и виртуальных методов.

Dark
03.03.2018
18:58:23
Нда

В чем смысл структуры тогда

Evgeny
03.03.2018
18:59:08
В чем смысл структуры тогда
Ни в чем, для совместимости с C оставили.

Dark
03.03.2018
19:00:43
Я всю свою жизнь жил в неведении

Evgeny
03.03.2018
19:01:10
бывает

многие ли из вас знают, что в D можно вот так делать? https://glot.io/snippets/eyty1bffd6

Pavel
03.03.2018
19:04:21
В мануале про структуры D есть сравнительнач таблица т про c++ тоже

Страница 424 из 719