
Oleg
19.06.2016
11:49:47
да
@chebotarevp чистая функция может вызвать только чистую
тоесть как-то так
import std.stdio;
class A
{
int value;
pure:
this() { value = 10; }
void inc() { value++; }
}
class B
{
A a;
pure:
this() { a = new A; }
void inc( int v ) { foreach( i; 0..v ) a.inc(); }
}
void main()
{
auto b = new B;
b.inc( 10 );
writeln( b.a.value ); // 20
}
и если учитывать то, что компилятор сам может проверить чистая ли функция, атрибут pure нужен как раз в ООП, так как он передаётся по наследству

Google

Oleg
19.06.2016
11:55:30
в случае с методами класса это не только оптимизация, но и "обещание", что все наследники будут переопределять эту функцию как чистую

Pavel
19.06.2016
11:57:23
pure:
this() { a = new A; }именно в таком виде, т.е. класс A не может быть засечен через сеттер извне например?
Потому что иначе не очень понятно как быть, если класс A изменяется где-нибудь в соседнем треде

Oleg
19.06.2016
12:11:11
так тоже работает
import std.stdio;
class A
{
int value;
pure:
this() { value = 10; }
void inc() { value++; }
}
class B
{
A a;
pure:
this( A a ) { this.a = a; }
void inc( int v )
{ foreach( i; 0..v ) a.inc(); }
}
void main()
{
auto a = new A;
auto b = new B(a);
b.inc( 5 );
a.inc();
b.inc( 4 );
writeln( b.a.value );
}

Dmitry
19.06.2016
12:12:12
Так хорошо, пасибо понял. Кстати а вот что сейчас все про ранджификацию всего Phobos говорят. Там суть в чем? Чтобы любые данные были типа Ranges?
Чтобы по ним ходить было можно?

Oleg
19.06.2016
12:12:59
range - диапазон
по сути ленивый массив
значения вычисляются только в момент обращения к ним
память лишний раз не выделяется
их продвигают потому, что они ленивы, и не требуют перевыделения памяти, по сравнению с работой с обычными массивами
и правильно делают

Dmitry
19.06.2016
12:15:13
Но на счет любых перечислений я прав? Что любые данные благодаря ним могут быть перечислениями?

Google

Dmitry
19.06.2016
12:15:29
И их можно перебирать, фильтровать, слайсы делать — и все однотипно

Oleg
19.06.2016
12:18:14
Нет
Только другие диапазоны или массивы

Dmitry
19.06.2016
12:21:47
М... а не мог бы пояснить в чем фишка и как ситуация в других языках обстоит где их нет?

Oleg
19.06.2016
14:28:14
@DmitryBubnenkov в С++ это итераторы и контейнеры
чем-то похоже на диапазоны

Dmitry
19.06.2016
14:29:47
А не мог бы какими то словами простыми объяснить, как если бы объяснял человеку мало смяслящему в программировании. В чем суть инетаторов с контейнерами и чем они от диапазонов отличаются

Oleg
19.06.2016
14:47:05
уфф... ну итератор это часть контейнера (2 объекта, 2 разные ответственности), итератор реализует семантику указателя (чтобы перейти к следующему элементу контейнера надо ++ сделать, чтобы получить элемент надо разыменовать как указатель), а диапазоны это 1 объект и он сразу реализует семантику массивов (ну отчасти для массивов дописали свойства, чтобы как с диапазоном можно было работать).
Если уж совсем просто, то это 2 разных подхода к абстрагированию от массива.

Dmitry
19.06.2016
14:56:03
короче диапазон это чтобы по массивам ходить? Типа надстройка над ними? Указатель + размер массива?

Pavel
19.06.2016
14:58:31
Надстройка, причем любая
точнее не любая, а содержащая свою логику
диапазон может ходить по массиву лениво, виртуально, через 1 элемент, через 2 элемента, или вообще придумывая элементы рандомно на ходу ...
Вот например взять диапазон дат - это такой объект, по которому ты можешь пройтись и вытянуть все дни месяца и недели, причем бесконечно
Эти дни не хранятся в массиве нигде, они на лету генерируются. Можешь так по диапазону хоть на 10000 леьт вперед пройти
Вообще очень похоже на генераторы то что я объяснил :)

Oleg
19.06.2016
15:03:06

Dmitry
19.06.2016
15:03:50
а ranges это тогда способ перебора элементов структуры?

Max
19.06.2016
15:04:07
Лол, нет

Dmitry
19.06.2016
15:04:20
%)

Max
19.06.2016
15:05:06
Это способ абстрагированно перебирать любые данные как тебе угодно

Google

Dmitry
19.06.2016
15:05:34
Max ну так я вроде бы это и написал...

Max
19.06.2016
15:05:55
Это не про структуру

Oleg
19.06.2016
15:06:01
да не перебирают структуры диапазонами
структуры перебирают __traits(allMembers, obj)
считай, что диапазон это массив
массив с точностью до определия массива как набора однотипных элементов
в общем это может быть и дерево
но однотипных элементов

Dmitry
19.06.2016
15:07:41
так, примерно понял. Т.е. получается для алфавита тоже есть правила переборки с методами pop, empty и еще какой-то там так?

Oleg
19.06.2016
15:07:45
структуры подразумевают под собой разные типы полей
нет
хотя если алфавит это физический массив с различными символами, то да
нельзя написать
char a = 'X';
a.pop
assert(a.popFront == 'Y');
с кавычками прогадал сначала (одинарые имел ввиду)

Dmitry
19.06.2016
15:10:27
Так, а если бы у нас числа не были бы обернуты в ranges а были просто массивом
[1,2,3,4,5,6]
то что с ними нельзя было бы сделать?

Max
19.06.2016
15:11:46
С точностью до наоборот
Не нужно ничего оборачивать, это на то и обобщенное программирование

Dmitry
19.06.2016
15:13:23
ну как же не нужно. Массив у нас размер + смещение. А для него нужны еще как я понимаю правила перебора и тут как раз Ranges и появляются

Oleg
19.06.2016
15:13:44
нет
вообще нет

Google

Oleg
19.06.2016
15:13:56
прям никак не так))
массив это размер + указатель, это верно
правила перебора в foreach для массивов были с самого начала

Max
19.06.2016
15:14:48
Ranges – это "шаблонная магия", а не конкретная реализация ф-й для конкретного типа

Oleg
19.06.2016
15:15:14
Max можно и конкретную реализация сделать, тоже будет диапазоном

Max
19.06.2016
15:15:44
Я про то, что имеется в стандартной библиотеки.

Oleg
19.06.2016
15:16:56
диапазон это не только правило перебора (через 1 брать из массива), но ещё и 3-4 способа генерации и трансформации данных =)

Dmitry
19.06.2016
15:17:56
Можно пример каких-то даных которые обернуты в ranges и что с ними они позволяют делать?

Oleg
19.06.2016
15:18:33
диапазон это абстракция, для твоего кода, который использует диапазон не важно будет диапазон массивом, генератором, трансформатором или ещё чем либо
для твоего кода важен только интерфейс взаимодействия представленным объектом (popFront, front, empty)
auto x = [1,2,3].map!(a=>a*a);
x — диапазон, не массив
когда ты пишешь x[1] ты вычисляешь каждый раз это
под x не выделена память, как под массив (диапазон содержит текущее состояние и исходный диапазон)
но x'ом ты можешь пользоваться как массивом
двунаправленный диапазон с произвольным доступом

Dmitry
19.06.2016
15:21:02
Я выдавил из себя такое определение:
"Так. Диапазон это такая штука которая для набора элементов данных описывает правила работы с ними"
верно?

Oleg
19.06.2016
15:21:53
если изменить слово "описывает" на слово "скрывает", то будет почти правда
диапазоны ведут себя как массивы — это и есть правило работы с ними
а что там внутри происходит не должно беспокоить твой великолепный шаблонный код
твой шаблонный код заботится только о наличии popFront, front и empty свойств для переданного объекта

Google

Oleg
19.06.2016
15:23:36
а передать ты можешь вообще дерево, которое реализует интерфейс диапазона
и простым foreach ты сможешь пройти по всем узлам

Dmitry
19.06.2016
15:24:57
Кстати, а вот можно пример полезности шаблона из реальной жизни (только простой по возможности). Пока я вижу только вариант когда функция должна принимать и int и float и чтобы перегрузку не делать проще шаблон определить

Oleg
19.06.2016
15:25:30
нет))
ты сам привёл достаточно простой пример)

Max
19.06.2016
15:25:48
Любой контейнер открой

Oleg
19.06.2016
15:25:48
ещё проще нельзя

Dmitry
19.06.2016
15:25:53
не, а кроме него

Oleg
19.06.2016
15:26:02
тут нельзя так просто сказать

Dmitry
19.06.2016
15:26:08
просто оно в реальной жизни на сколько нужно?

Oleg
19.06.2016
15:26:20
вот мы тебе пример приведём, ты скажешь "ну так можно же без него", а мы то не сможем возразить

Dmitry
19.06.2016
15:26:37
а ок

Oleg
19.06.2016
15:26:39
всё зависит от тебя
точнее от твоего образа мышления, когда ты пишешь код
если ты мыслишь обобщённо, то без шаблонов можно заработать депрессию и вскрыть вены себе...
но если ты не особо понимаешь насколько это мощьный инструмент в написании кода, то их отсутствие тебя не парит

Dmitry
19.06.2016
15:28:28
мне походу пока без них проще
пасибо за развернутые ответы)

Oleg
19.06.2016
15:29:00
вот когда начнёт напрягать дублирование кода, тогда ты взглянешь на шаблоны (чтобы самому их писать)