@dlangru

Страница 239 из 719
Oleg
24.08.2017
01:34:55
Обнаружил в ванной, думаю стоит выкинуть

Maxim
24.08.2017
03:50:06
главное убедиться, что кто-то будет его ловить

Ievgenii
24.08.2017
09:47:49
))))

Dmitry
24.08.2017
10:57:33
Как я понимаю в Шарпе все же добавили интерполяцию строк: Console.WriteLine($"Hello {args[0]}!");

Google
Dmitry
24.08.2017
10:58:13
а она когда примерно вышла?

NullSanya
24.08.2017
10:58:33
Хм... Когда vs 2015 вроде

Точно не помню

Да, 2015 год

Dmitry
24.08.2017
11:44:23
А на шарпе есть аналог Дишного version(OSName) ?

NullSanya
24.08.2017
11:50:45
А на шарпе есть аналог Дишного version(OSName) ?
ну точно не помню, вроде нет

мб как то можно через #if

Maxim
24.08.2017
11:53:11
ну там, по сути, тогда будет version(Windows) и version(Mono)

NullSanya
24.08.2017
11:53:36
или в рантайме уже чекать ос

Dmitry
25.08.2017
07:00:13
Ребят, а как заставить https://dlang.org/phobos/std_file.html#write писать в бинарном режиме? я пробовал f.write(cast(ubyte[])rs.responseBody.data);. не заработало p.s. про rawWrite знаю

Maxim
25.08.2017
07:01:51
так это, по сути, тот же write, который и на экран пишет, только через rawWrite

Google
Maxim
25.08.2017
07:02:33
а, ну или cast(string) попробовать)

Dmitry
25.08.2017
07:02:51
мне бинарные данны надо записать

write в каком режиме пишет? как его назвать?

Maxim
25.08.2017
07:03:15
ни в каком)

Dmitry
25.08.2017
07:03:26
в плане?

Maxim
25.08.2017
07:03:36
ну в прямом плане)

Dmitry
25.08.2017
07:04:33
объясни плиз, не понимаю

Maxim
25.08.2017
07:05:27
в каком режиме открывать файл, ты казываешь при его открытии "wb" — запись в binary mode

Dmitry
25.08.2017
07:05:44
А!

а просто режим w это как его назвать?

Maxim
25.08.2017
07:06:12
а write интерпретирует переданные ему данные, если ты передашь в него byte[], он запишет [1, 2, 480, 15] и так далее)

поэтому, можно попробовать записать cast(string), по идее, должно прокатить, поскольку в D строки не null-terminated, но лучше, конечно, rawWrite использовать

Dmitry
25.08.2017
07:07:41
а почему string если данные бинарные то?

Maxim
25.08.2017
07:08:15
ну потому что string — это последовательность байтов, которую write не должен никак интерпретировать

Dmitry
25.08.2017
07:08:19
Request rq = Request(); Response rs = rq.get("http://geoserver.readthedocs.io/en/latest/_images/imagemosaiccreate1.png"); File f = File("123.png", "wb"); f.write(cast(ubyte[])rs.responseBody.data); пробовал с кастом и без — пишет 1 2 480 15

сейчас попробую стринг

Maxim
25.08.2017
07:08:55
а чем rawWrite не устраивает?

Dmitry
25.08.2017
07:09:02
фигеть! стринг работает!

да я просто хочу во первых разобраться во вторых разрабу dlang-request помочь с докой

Maxim
25.08.2017
07:09:35
ну он и должен работать)

Google
Dmitry
25.08.2017
07:10:00
а почему фишка с ubyte[] не работает?

вроде массив битов...

Maxim
25.08.2017
07:11:26
потому что write, в зависимоти от переданного типа пытается вывести его в человекопонятном виде, массивы он выводит в виде последовательности значений через запятую

структуру в формате имяСтруктуры(значение1, значение2) и так далее

а строка и есть строка — это последовательность байтов, кодирующся символы, поэтому write ее так и выводит)

но вообще, конечно, это извращение, самый простой способ записать бинарные данные в файл — это fwrite, надстройкой над которым и является rawWrite

Dmitry
25.08.2017
07:25:21
@maxfreck не мог бы глянуть перед тем как я тому разрабу отправлю?

Для записи загруженного файла рекомендуется использовать функцию rawWrite из состава std.stdio которая выполняет запись в бинарном виде. Возможно так же использовать функцию write, но тут следует учитывать, что она пытается интерпритировать входной массив в человекопонятном виде. Так при записи бинарного файла вы можете получить последовательность вида [1, 2, 480, 15, 72]. Чтобы этого избежать вам нужно указать, что последовательность нужно интерпритировать как единое целое выполнив cast к типу string. Пример: File f = File("123.png", "wb"); // не забываем указать что открываем файл на запись в бинарном режиме f.write(cast(string)rs.responseBody.data); Пример 2: File f = File("123.png", "wb"); f.rawWrite(rs.responseBody.data);

Maxim
25.08.2017
07:26:16
ну да, все вроде так)

Dmitry
25.08.2017
07:33:36
Так, а кто мне пример простого делегата может показать? https://tour.dlang.org/tour/en/basics/delegates смотрел, но сути так и не понял

Maxim
25.08.2017
07:35:38
делегат — это просто функция, которая знает о переменных в своей области видимости

она же closure или замыкание

Dmitry
25.08.2017
07:36:19
она же closure или замыкание
это я вообщ не понимаю(((

Maxim
25.08.2017
07:38:03
ну вот если ты просто объявишь функцию внутри функции, то она не будет иметь доступа к переменным, которые объявлены рядом с ней в этой же функции, а делегать будет

Dmitry
25.08.2017
07:38:56
void foo() { int x; void bar() { int y; } }

так типа? и y не будет виден из foo ?

Maxim
25.08.2017
07:42:58
вот пример

Dmitry
25.08.2017
07:43:22
О, спасибо, смотрю

а если сюда классы добавляются, то как будет выглядеть?

Maxim
25.08.2017
07:51:08
да так же все будет выглядеть)

Google
Dmitry
25.08.2017
07:51:56
только там будет экземпляр класса так?

Maxim
25.08.2017
07:52:21
там это где?)

Dmitry
25.08.2017
07:53:31
MyClass mc = new MyClass(); // тут есть foo() auto doFooFunct = delegate() { mc.foo() ; }

Maxim
25.08.2017
07:53:38
по сути, function(params) и delegate(params) — это объявление анонимных функций, одна без контекста, другое с контекстом

та, которая delegate, может использовать любые переменные из окружающего контекста, в том числе и классы, и структуры

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

Dmitry
25.08.2017
07:55:11
итого мы создали функцию и на нее другую функцию повесили так?

"та, которая delegate, может использовать любые переменные из окружающего контекста" и передавать их в ту функцию на которую она указывает?

import std.stdio; import std.file; void main() { string name = "Mike"; MyClass mc = new MyClass(); auto mydel = delegate() { mc.say(name); }; mydel(); } class MyClass { void say(string name) { writeln("Hello, ", name); } } это вся магия? Или я чего-то упускаю?

Admin
ERROR: S client not available

Dmitry
25.08.2017
08:14:03
мы же могли просто без делегата все вызвать

"Это указатель на функцию, который дополнительно содержит информацию об контексте" Контекст это что?

Maxim
25.08.2017
08:56:05
у каждой переменной есть область видимости, грубо говоря, за пределами фигурных скобок, в которых она объявлена, ее не видно

делегат и функция из моего пример — это те же самые перменые, их можно передать параметром в какую-нибудь функцию, находящуюся, например, в другом модуле, и она сможет там вызвать функцию через переменную

отличие делегата от функции в том, что делегат знает, что рядом с ним была объявлена переменная hello

вот более сложный пример)

Andrey
25.08.2017
09:12:19
главное понять что делегат это указатель на функцию + указатель на контекст

в поле контекста может храниться указатель на структуру или класс (когда делегат получается путем взятия адреса метода), либо контекст это стек-фрейм внешней функции (когда делегат получается путем взятия адреса вложенной функции), либо замыкание (когда делегат получается путем взятия адреса вложенной функции и функция использует внешние переменные, и при этом делегат живет дольше используемых переменных; в таком случае все переменные копируются на кучу и контекст указывает на эти переменные)

Dmitry
25.08.2017
09:47:16
забыл, как дабу передать флаги dmd типа -betterС

пробовал: dub dflags=betterС

Google
Dmitry
25.08.2017
09:52:20
> dub build dflags "-betterС" Failed to find a package named 'dflags'.

если слово build убрать, то тупо справку выводит вместо сборки проекта

Maxim
25.08.2017
09:57:04
это, насколько я понимаю, в dub.json или dub.sdl должно быть

"dflags": ["-betterC"]

Dmitry
25.08.2017
09:57:45
а в консоли передать нельзя?

Pavel
25.08.2017
09:58:34
попробуй --dflags или --dflags-dmd

Ievgenii
25.08.2017
10:23:29
Важно понимать, что делегат - потенциальная точка утечки памяти. Я не говорю их не использовать, сам их часто использую, просто важно это помнить!

Как когда-то Александреско сказал: разница между анонимной функцией и делигатом не велика, всего один указатель (4 или 8 байт)...

Вот так красиво завуалировал)))

Maxim
25.08.2017
10:25:53
а почему это точка утечки памяти?)

Ievgenii
25.08.2017
10:26:35
Ты замыкаешь контекст, и если этот делегат не будет удален, то и тот стек (контекст) не будет удален.

Это не точка утечки памяти, а потенциальная утечка памяти.

Поэтому то и стараются использовать анонимные функции

Есть даже подход, когда в методе создают анонимную функцию, в нее передают только те параметры, которые нужно, а уже в этой анонимной функции создаётся делегат...

Вот такие извращения видел...

Maxim
25.08.2017
10:31:16
ну это не утечка памяти, а просто излишнее потребление, все равно рано или поздно сборщик все удалит

Ievgenii
25.08.2017
10:31:37
Нет

Если делегат останется где-то висеть, то его не удалят, а вместе и с ним останется ссылка на контекст...

То и контекст не удалится...

Maxim
25.08.2017
10:33:01
а где он может остаться так висеть?

Ievgenii
25.08.2017
10:59:48
Ну в каком-то таймере или ещё где-то ссылку оставишь.

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